我在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
在互联网上的一些地方,我读到我可以做到
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
UIElement editingelement = GetTemplateChild("PART_EditingElement");
if (editingelement != null)
{
// do something
}
}
当我尝试对GetTemplateChild
说“不要使用”这个建议时。
所以我的问题是
为什么不使用GetTemplateChild
。它已经过时了吗?以及
FrameWorkTemplate.FindName
和ControlTemplate.FindName
有什么区别?
答案 0 :(得分:4)
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.FindName和FrameworkElement.FindName不同。 FrameworkElement.FindName
只查看子元素,但不查看模板,而FrameworkTemplate.FindName
只查看模板自己的元素,但不查看它应用的父元素。