gpt4 book ai didi

c# - .Net 3.5 中的 GetTemplateChild 是否已过时以及 FrameWorkTemplate.FindName 和 ControlTemplate.FindName 之间的区别是什么

转载 作者:太空狗 更新时间:2023-10-30 01:21:11 25 4
gpt4 key购买 nike

我覆盖了 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

我在 Internet 上看到的一些我可以做的事情

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.

唯一的区别是 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 只查看模板自己的元素而不是它应用到的父元素。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com