我在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进行此建议时,请说“请勿使用”。

所以我的问题是
  • 为什么不使用GetTemplateChild。它过时了吗?和
  • FrameWorkTemplate.FindNameControlTemplate.FindName有什么区别?
  • 最佳答案

    1。

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

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

  • 否则,此代码:
    this.GetTemplateChild(name)
    

    从字面上等效于以下代码:
    this.Template.FindName(name, this)
    

    我不知道为什么将其标记为“请勿使用”。我注意到该注释存在于MSDN页面上的version 3中,并已从version 3.5中删除,但我不知道这是否意味着任何意义。

    2。

    你是说FrameworkElement吗?就像Je​​ns所说的那样,ControlTemplate继承了FrameworkTemplate,它们都使用FrameworkTemplate.FindName方法。但是FrameworkTemplate.FindNameFrameworkElement.FindName不同。 FrameworkElement.FindName仅查看子元素内部,而不查看模板,而FrameworkTemplate.FindName仅查看模板自身的元素,而不查看模板所应用的父元素。

    关于c# - .NET 3.5中的GetTemplateChild是否已过时?FrameWorkTemplate.FindName和ControlTemplate.FindName之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16352604/

    10-13 05:46