2013-05-03 35 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只查看模板自己的元素,而不查看它应用于的父元素。

相关问题