6

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

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

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

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说不要使用。

在此处输入图像描述

所以我的问题是

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

  2. FrameWorkTemplate.FindName和 和有什么不一样ControlTemplate.FindName

4

1 回答 1

3

1.

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

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

否则,此代码:

this.GetTemplateChild(name)

字面上等同于这段代码:

this.Template.FindName(name, this)

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


2.

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

于 2013-05-10T16:15:59.990 回答