我希望能够遍历visual ui树,寻找一个ID绑定到visual元素的Tag属性的元素。
我想知道我是怎么做到的。控件没有子项可以遍历。
我开始使用LogicalTreeHelper.GetChildren,它似乎按预期工作,直到我点击TreeView控件...然后LogicalTreeHelper.GetChildren不会返回任何子项。
注意:目的是找到与数据项对应的可视UI元素。也就是说,给定项目的ID,Go找到显示它的UI元素。
编辑:我显然没有足够好地解释这一点。我将一些数据对象绑定到TreeView控件,然后想要以编程方式为业务对象的ID选择特定项。我不明白为什么遍历可视树并找到我想要的元素是如此困难,因为数据对象的ID在相应视觉元素的Tag属性中。我正在使用Mole,我能够在其标签中找到具有相应ID的UI元素。我只是在代码中找不到视觉元素。 LogicalTreeHelper不会遍历树中的任何项目。 ItemContainerGenerator.ContainerFromItem也不为树视图中的项检索任何内容。
答案 0 :(得分:1)
看看这个sample。 我发现这个样本编写得很好,我相信使用视图模型可以解决你的问题。
编辑关于搜索可视树。 TreeView和TreeViewItem都有Items属性,您可以遍历和搜索您的Id。你不能用吗?
答案 1 :(得分:0)
问题是只创建了可见的TreeViewItems
- WPF不会预先创建所有项目(由于我想象的大树可能需要的时间长度)。
更好的方法是创建一个模仿树数据结构的数据结构,并使用数据绑定告诉TreeView
如何显示该数据。如果你愿意,我可以写一个简单的例子。
编辑:根据您的编辑,只有在为该对象创建UI项目时才能使用,但这不能保证。看一下IItemContainerGenerator接口(通过调用ItemsControl.ItemContainerGenerator检索。我相信有一个方法可以返回给定数据对象的UI容器(即TreeViewItem
)。如果先前已创建UI容器,则工作。
答案 2 :(得分:0)
LogicalTreeHelper.GetChildren查看控件的LogicalChildren属性,默认情况下,对于TreeView(从ItemsControl类派生),该属性为null。您可能必须检查GetChildren返回的对象的类型,当您访问TreeView对象时,请执行一些特殊的处理逻辑。
该特殊逻辑可能会迭代树的Items并尝试将它们转换为FrameworkElement(定义Tag属性的基类)。
答案 3 :(得分:0)
我通过使用VisualTreeHelper递归可视树来完成类似的事情。查看由Jim Baltzell-Gauthier编写的this blog post - 它提供了一些辅助方法来遍历可视化树并按名称和类型返回元素,这类似于我在当前项目中使用的代码。您可以修改这些函数,使其检查标记值,而不是名称。
使用Visual Tree需要注意的一点是,除非已经加载了视觉效果,否则它不存在 - 如果视觉元素没有被加载,您可能需要将委托附加到视觉元素的“已加载”事件中在你调用代码的时候渲染。