2011-04-07 127 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