我使用WPF树视图,其中包含许多项目,例如1000。树视图加载速度非常慢,所以我从下一个链接开始关注微软的建议:
http://msdn.microsoft.com/en-us/library/cc716882.aspx
我将VirtualizingStackPanel.IsVirtualizing设置为“True”,VirtualizingStackPanel.VirtualizationMode设置为“Recycling”。树视图的性能现在非常好,但是会出现一个问题。
当我想在树视图中找到一个超出可见节点的节点时,TreeViewItem将为null。例如,我想在树视图顶部的树视图中找到一个节点。我想在搜索节点并显示需要显示的节点后自动将树视图滚动到顶部。我怎么能这样做?
真诚地感谢您的帮助!
答案 0 :(得分:1)
由于TreeView的Virtualization
为on
,因此不会为不可见的对象生成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 将更改 滚动时将替换显示的值。