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

Nik*_*wal 6 c# wpf controltemplate

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

<Setter Property="Template">
    <Setter.Value>
        --Added my button here.
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

所以在加载控制事件中我做了

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

//Add Events on my button
Run Code Online (Sandbox Code Playgroud)

我在互联网上读到的一些我可以做的地方

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

    UIElement editingelement = GetTemplateChild("PART_EditingElement");
    if (editingelement != null) 
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试做这个建议时GetTemplateChild说不要使用。

在此处输入图片说明

所以我的问题是

  1. 为什么不使用GetTemplateChild. 它过时了吗?和

  2. FrameWorkTemplate.FindName和 和有ControlTemplate.FindName什么区别?

nmc*_*ean 3

1.

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

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

否则,这段代码:

this.GetTemplateChild(name)
Run Code Online (Sandbox Code Playgroud)

从字面上看相当于这段代码:

this.Template.FindName(name, this)
Run Code Online (Sandbox Code Playgroud)

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


2.

你的意思FrameworkElement?就像 Jens 所说,ControlTemplate继承FrameworkTemplate,并且他们都使用该FrameworkTemplate.FindName方法。但FrameworkTemplate.FindNameFrameworkElement.FindName是不同的。FrameworkElement.FindName只查看子元素内部,而不查看模板,而FrameworkTemplate.FindName只查看模板自己的元素,而不查看其应用的父元素。