WPF之GetTemplateChild和FindName方法
FindName是公共方法,而非受保护方法,它使用恰当的名称范围措施,从而可以访问某个元素中的模板并在其中查找命名项。
FindName()首先评估该FrameworkElement实例是否包含一个命名范围。如果该实例是一个xaml文件的root,则它包含一个命名范围。然而,如果该实例不包含一个命名空间,该方法则遍历可视树(visual tree),查找最近的命名范围,并解析名称。最近的命名范围可能是template的命名范围,style的命名范围和根节点的命名范围。
FindName方法不会交叉到其他的命名范围,如果一个template被应用到控件当中,在控件中使用FindName方法就不会获得在Template中以x:Name声明的元素了。
GetTemplateChild该方法被声明为protected internal,所以必须在使用模板控件内部的代码中访问它。
个人认为,这两个方法最好都用在OnApplyTemplate函数中,在用户自定义控件中用GetTemplateChild,其他情况用FindName。
如果找到对应的对象之后,一般是对该对象增加某种事件,或者添加某种效果。但是如果要将该对象赋值给另一个FromeWorkElement时,会出现要求你先断开其与父对象的连接,再复制。这时只需用对象.Parent获得父对象,并将其Child或者items清空即可。