2011-04-07 122 views
3

我创建类,从窗口继承和我正在申请控制模板将其:寻找控制在WPF控件模板

public class BaseSearchWindow : Window { 
     static BaseSearchWindow() { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(BaseSearchWindow), new FrameworkPropertyMetadata(typeof(BaseSearchWindow))); 
     } 
     public BaseSearchWindow() { 
      Uri uri = new Uri("/WPFLibs;component/Resources/StyleResources.xaml", UriKind.Relative); 
      ResourceDictionary Dict = Application.LoadComponent(uri) as ResourceDictionary; 
      this.Style = Dict["WindowTemplate"] as Style; 
     } 

比我想找到控制模板中的一些控制:

public override void OnApplyTemplate() { 

       RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand; 
       //doesn't work, searchCommand is null 
       searchCommand.CanExecute += CanExecuteRibbonCommand; 
    } 

但它是无效的。 我在继承类中尝试过它,它可以工作,但我希望它在我的基类中,所以我不必每次使用该类时都要搜索它。 这工作:

public partial class MainWindow : BaseSearchWindow { 
     public MainWindow() { 
      InitializeComponent(); 
      RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand; 
      searchCommand.CanExecute += CanExecuteRibbonCommand; 

     } 

回答

0

其实我犯了一个错误。当我尝试查找不是RibbonCommands的控件时,所以现在我先查找父控件,然后使用VisualTreeHelper查找RibbonCommand。对此我很抱歉,我确信它只能在扩展课程中使用,但当我发布这个问题时,我想我太累了。无论如何,谢谢你的帮助。

1

使用OnApplyTemplateFindName是这样做的正确方法;我认为它不起作用,因为您忘记了拨打base.OnApplyTemplate()

+0

我已经试过了,不起作用,尽管它应该,至少在理论上。 – Vale 2011-04-07 13:53:16

+0

你可以编辑问题发布XAML代码吗? – 2011-04-07 14:06:14

+0

是的,但不是今天,我现在回家了,我明天一上班就会发布。 – Vale 2011-04-07 14:32:51

0

我敢打赌,你正在寻找一个命令不存在(或具有不同的名称)或不是一个RibbonCommand。

您或者您没有指定x:FieldModifier="protected"作为xaml中的命令。

+0

不,因为它在扩展类中工作,正如我在问题中所述。 – Vale 2011-04-07 21:15:29