在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里。但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值)。
如果你是比我还白的小白,对我刚刚陈述的东西不清楚,接下来我简单说一下什么是把控件放在数据模板中,怎么样的情况没法后台通过名字来获取控件,如果读者对于数据模板这些事儿已经清楚了,或者只关心如何使用可视化树可以将这部分跳过哈。
先上代码介绍一下什么是数据模板以WPF中列表框控件为例:
& lt; ListBox Name=" ListBox_1 " HorizontalAlignment=白蟆备叨?" 299 "利润率=?0、10 0 0”VerticalAlignment=岸ゼ丁笨矶?" 497 " MouseDoubleClick=癓istBox_1_OnMouseDoubleClick”比; & lt; ListBox.ItemTemplate> & lt; DataTemplate> & lt;按钮名称=癇utton_1”内容=" 666 "祝辞& lt;/Button> & lt;/DataTemplate> & lt;/ListBox.ItemTemplate> & lt;/ListBox>
我在后台设置了显示了8行项目,效果如下:
我们可以看到重写数据模板实现的效果是在列表框的每一项项目都是一个按钮,这里介绍的只是一些简单应用例子,重写模板是很强大的。因为如果用到可视化树多半是因为使用了数据模板在后台用名字无法找到相应控件了,所以在此简单介绍一下,方便理解。
接下来我们在后台尝试通过控件的名字来找到我们的列表框和按钮
我们发现通过控件的名字可以找到列表框但是通过按钮的名字却无法找到按钮,这就是数据模板搞的鬼。
但是没有关系,我们可以通过可视化树从列表框里找到它的子控件我们想要的这个按钮。
重点来了,先上代码,可视化树通过父控件找到它的子控件:
ListFindVisualChild (DependencyObject obj)师:DependencyObject { 试一试 { List 列表=new List (); for (int i=0;我& lt;VisualTreeHelper.GetChildrenCount (obj);我+ +) {=VisualTreeHelper DependencyObject孩子。GetChild (obj,我); 如果孩子是T) { list.Add ((T)的孩子); List childOfChildren=FindVisualChild (孩子); 如果(childOfChildren !=null) { list.AddRange (childOfChildren); } } 其他的 { List childOfChildren=FindVisualChild (孩子); 如果(childOfChildren !=null) { list.AddRange (childOfChildren); } } } 返回列表; } 抓住(异常) {//MessageBox.Show (ee.Message); 返回null; } }
先将上面的方法复制到你的项目当中,此时对于可视化树的应用已经完成一半了。
接下来上代码,通过可视化树双并击列表框的一把对应的按钮的内容值从666改成777:
私人空间ListBox_1_OnMouseDoubleClick(对象发送方,MouseButtonEventArgs e) { ListBoxItem myListBoxItem=(ListBoxItem) ListBox_1.ItemContainerGenerator.ContainerFromItem (ListBox_1.SelectedItem); List
效果就是双击哪个项哪个条目中的按钮从666变成了777 .
我们通过父控件找到了里面的子控件按钮,我们便可以对它进行任何操作(和用名字找到是一样的)。
以上关于可视化树的代码可以应用于列表框,DataGrid, ListView,树状视图,对于“.ItemContainerGenerator.ContainerFromItem”这段代码的含义我暂时不是很理解,欢迎指教和交流。
通过以上的例子相信读者已经可以使用可视化树找到相应的控件了,但在我的开发过程中曾遇到过一些问题,和对于使用可视化树的一点小建议。