GetTemplateChild在.Net 3.5中是否已过时,FrameWorkTemplate.FindName和ControlTemplate.FindName之间有什么区别?

时间:2013-05-03 06:02:00

标签: c# wpf controltemplate

我在ResourceDictionary Generic.xaml中覆盖了控件的模板。在那里我添加了一个按钮,我想添加一些事件。

<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有什么区别?

1 个答案:

答案 0 :(得分:4)

1

唯一的区别是GetTemplateChild会在以下情况下返回null

  • 不存在模板,或
  • 命名对象存在,但不是DependencyObject(我不知道这是否可行)。

否则,此代码:

this.GetTemplateChild(name)

在字面上等同于此代码:

this.Template.FindName(name, this)

我不知道为什么它被标记为“不要使用”。我注意到此注释存在于version 3的MSDN页面上,已从version 3.5中删除,但我不知道这是否意味着什么。


2。

您的意思是FrameworkElement吗?就像Je​​ns所说,ControlTemplate继承FrameworkTemplate,他们都使用FrameworkTemplate.FindName方法。但FrameworkTemplate.FindNameFrameworkElement.FindName不同。 FrameworkElement.FindName只查看子元素,但不查看模板,而FrameworkTemplate.FindName只查看模板自己的元素,但不查看它应用的父元素。