【问题标题】:Is GetTemplateChild Obsolete in .Net 3.5 and what is the difference between FrameWorkTemplate.FindName and ControlTemplate.FindName.Net 3.5 中的 GetTemplateChild 过时了吗? FrameWorkTemplate.FindName 和 ControlTemplate.FindName 之间有什么区别
【发布时间】:2013-05-03 06:01:59
【问题描述】:

我在 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.FindNameControlTemplate.FindName有什么区别?

【问题讨论】:

  • 回答您的 2. 问题。 ControlTemplate 继承了 FrameworkTemplate,所以差别不大。看here

标签: c# wpf controltemplate


【解决方案1】:

1.

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

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

否则,这段代码:

this.GetTemplateChild(name)

字面意思等同于这段代码:

this.Template.FindName(name, this)

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


2.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2011-02-23
    • 1970-01-01
    • 2016-10-30
    • 2011-04-20
    • 2013-09-13
    • 2017-04-05
    相关资源
    最近更新 更多