2013-05-03 71 views
4

我重寫了ResourceDictionary中控件的模板Generic.xaml。在那我添加了一個我想添加一些事件的按鈕。GetTemplateChild .Net 3.5中已廢棄,FrameWorkTemplate.FindName和ControlTemplate.FindName之間的區別是什麼

<Setter Property="Template"> 
    <Setter.Value> 
     --Added my button here. 
    </Setter.Value> 
</Setter> 

所以在控制的Loaded事件我做

Button b = (Button)mycontrol.Template.FindName("PARTName", mycontrol) 

//Add Events on my button 

在互聯網上我看到,我可以做

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    UIElement editingelement = GetTemplateChild("PART_EditingElement"); 
    if (editingelement != null) 
    { 
     // do something 
    } 
} 

當我試圖做的這條建議GetTemplateChild說難道不是一些地方使用。

enter image description here

所以我的問題是

  1. 爲什麼不使用GetTemplateChild。它過時了嗎?並且

  2. FrameWorkTemplate.FindNameControlTemplate.FindName有什麼區別?

+0

回答你的問題。 'ControlTemplate'繼承'FrameworkTemplate',所以差異沒有任何問題。看[這裏](http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx) – 2013-05-03 06:07:15

+0

[原因在這裏](http://msdn.microsoft.com/en -us /庫/ system.windows.frameworkelement.gettemplatechild.aspx) – noobob 2013-05-03 06:09:06

回答

4

1.

唯一的區別是,GetTemplateChild將返回null時:

  • 沒有模板存在,或
  • 命名對象存在但不是一個DependencyObject(我不不知道這是否可能)。

否則,此代碼:

this.GetTemplateChild(name) 

簡直是等同於以下代碼:

this.Template.FindName(name, this) 

我不知道爲什麼它被標記爲 「不使用」。我注意到這個註釋存在於version 3的MSDN頁面,並從version 3.5中刪除,但我不知道這是否意味着什麼。


2.

你的意思是FrameworkElement?像延斯說的那樣,ControlTemplate繼承了FrameworkTemplate,他們都使用FrameworkTemplate.FindName方法。但FrameworkTemplate.FindNameFrameworkElement.FindName是不同的。 FrameworkElement.FindName只能查看子元素內部,而不查看模板,而FrameworkTemplate.FindName只查看模板自己的元素,而不查看它應用於的父元素。

相關問題