博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WPF之GetTemplateChild和FindName方法

Posted on 2011-05-26 11:30  linFen  阅读(2736)  评论(0编辑  收藏  举报
在wpf中,在创建完控件之后,系统开始匹配控件所用的Style或者template。在程序中,可以用GetTemplateChild或者FindName来获得Resource中用x:Name="名字"声明的对象。

  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清空即可