posts - 1180, comments - 162, trackbacks - 1, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

WPF之GetTemplateChild和FindName方法

Posted on 2011-05-26 11:30 linFen 阅读(175) 评论(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清空即可