我希望能够遍历视觉UI树寻找与结合到视觉元素的标记属性的ID的元素。

我不知道我是如何做到这一点。控件没有孩子遍历。

我开始使用LogicalTreeHelper.GetChildren,这似乎工作打算,直到我打了一个TreeView控件...然后LogicalTreeHelper.GetChildren犯规返回任何子女。

注意:目的是要找到对应于该数据项的视觉UI元素。也就是说,考虑到项目的ID,去找显示它的UI元素。

编辑:我显然不是在解释这个不够好。我的一些数据对象绑定到TreeView控件,然后想选择一个特定的项目programaticly因为业务对象的ID。我不明白为什么它是如此难以Travers的可视化树,并找到我想要的元素,数据对象的ID是在适当的视觉元素的Tag属性。我使用的是鼹鼠,我能够在它的标签相应的ID,找到UI元素。我只是无法找到代码中的视觉元素。 LogicalTreeHelper不遍历树中的任何项目。也不对ItemContainerGenerator.ContainerFromItem检索树视图中的项目什么。

没有正确的解决方案

其他提示

看一看一个此样品。 我发现这个样本写得很好,我相信使用视图模型将解决你的问题。

修改并关于搜索的可视化树的。无论TreeView和树型视图有项目属性,你可以遍历并搜索您的ID。你不能用它?

问题是,只有TreeViewItems是可见的已创建 - WPF不创建的所有项目前面(由于时间的长短,可以采取的大树下,我会想象)

有一个更好的方法是创建一个模仿你的树数据结构的数据结构,并使用数据绑定告诉TreeView如何显示数据。我可以写一个简单的例子,如果你愿意的话。

编辑:根据您的编辑,如果UI项目已被该对象,这是无法保证创建只会工作。看看在 IItemContainerGenerator 接口(通过调用 ItemsControl.ItemContainerGenerator 检索我相信具有将返回UI容器的方法(即TreeViewItem),用于一个给定的数据对象。如果UI容器已被先前创建的这只会工作。

LogicalTreeHelper.GetChildren着眼于控制的LogicalChildren属性,这是通过默认一个TreeView(自ItemsControl类派生)空。您可能需要检查通过的GetChildren返回的对象的类型,当你来到一个TreeView对象,然后做一些特殊的处理逻辑。

这是特殊的逻辑可能是遍历树的项目,并试图将它们转换成一个FrameworkElement的(基类定义标签属性)。

我已经通过使用VisualTreeHelper可视树递归做过类似的事情。请查看这个博客帖子写由吉姆·Baltzell,高塞尔 - 它提供了一些辅助方法走可视化树,并通过名称和类型返回的元素,这是类似于我使用我的当前项目的代码。你可以修改这些功能,有它检查变量值,而不是或除了名称。

有一点要注意的与视觉树是,它不存在,除非视觉效果已经被加载 - 你可能需要一个委托连接到您的视觉元素的“装”事件,如果视一直没有在您调用代码点尚未呈现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top