如何在WPF树视图中查找节点?

时间:2013-11-02 08:16:16

标签: c# wpf treeview

我使用WPF树视图,其中包含许多项目,例如1000。树视图加载速度非常慢,所以我从下一个链接开始关注微软的建议:

http://msdn.microsoft.com/en-us/library/cc716882.aspx

我将VirtualizingStackPanel.IsVirtualizing设置为“True”,VirtualizingStackPanel.VirtualizationMode设置为“Recycling”。树视图的性能现在非常好,但是会出现一个问题。

当我想在树视图中找到一个超出可见节点的节点时,TreeViewItem将为null。例如,我想在树视图顶部的树视图中找到一个节点。我想在搜索节点并显示需要显示的节点后自动将树视图滚动到顶部。我怎么能这样做?

真诚地感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

由于TreeView的Virtualizationon,因此不会为不可见的对象生成itemcontainers(treeViewItem)。这就是你为treeviewItem获取null的原因。

如果你想获得treeViewItem,你需要以某种方式为底层对象生成容器,你可以通过调用BringIntoView方法来完成。

详细说明可以在MSDN带样品找到。

答案 1 :(得分:0)

实际上 VirtualizingStackPanel 不会连续加载元素。 相反,它重新使用现有元素并替换它们后面的 DataContext 。 例如,如果您有一个包含1000个项目的 VirtualizingStackPanel , 并且一次只能看到20个,但实际上它为滚动缓冲区提供了更多项目。

例如,在您的情况下,您会看到20个项目和5个额外项目的滚动缓冲区。 滚动时,这些20 + 5控件后面的 DataContext 会发生变化, 但实际控制本身永远不会被取代。

如果您在 TreeViewItem#1 中输入,并且 TreeViewItem.Value 未绑定任何内容,则值将永远显示,因为控件正在重新使用。  如果将 TreeViewItem.Value 绑定到某个值,则 DataContext 将更改 滚动时将替换显示的