TreeView 虚拟化

13
我们正在尝试找到一种好的方式来虚拟化TreeView,数据不是问题,因为它非常轻(每个项目大约16字节),问题是我们可能会有成千上万个项目,尽管实际数据只需要160 kb的内存,但 TreeView 项确实使用了更多的内存。我们已经尝试过三个不同的树形控件,WPF、Infragistics 和 Telerik。所有这些都存在严重问题,使它们无法在我们的应用程序中使用:
- WPF TreeView:滚动条表现出一些奇怪的行为,跳来跳去,大小不一致,用鼠标拖动滚动条无法正常工作(来回跳动)。 - Telerik:项目消失,滚动条也不稳定,项目随机展开和折叠,样式不起作用。 - Infragistics:项目根本没有虚拟化,每个项目都停留在内存中,使虚拟化毫无用处。
我们已经苦苦挣扎了几个月,仍然找不到好的解决方案。你们中是否有任何人成功地在超过9000个项目的TreeView中实现了虚拟化?如果有,你采用了什么策略?您是否使用了第三方控件?它完全有效吗?
任何建议都会极大地帮助。谢谢。

1
+1 我也遇到了WPF虚拟化树形视图的同样问题,尝试了所有方法,但在涉及滚动时行为仍然不稳定。 - BrokenGlass
@BrokenGlass 感谢您支持这个问题。我希望我们能得到一个好的解决方案。 - Carlo
请看我在这里提出的相关问题(显然没有答案):https://dev59.com/G1HTa4cB1Zd3GeqPSpBG - BrokenGlass
2个回答

5
我们使用了Bea Stollnitz的技巧,在ListView中缩进项目并使用UI虚拟化,取得了良好的效果。在支持的ICollectionView中有100,000个项,并且对过滤等操作仍然非常响应。 http://www.beacosta.com/blog/?p=45

很遗憾,这不能直接在虚拟化的树视图中使用,而必须使用这些技巧。 - BrokenGlass
但她提到这个解决方案是因为TreeView在3.5之前没有虚拟化,所以我想知道它是否真的解决了问题。我会立即尝试一下,感谢您的建议。 - Carlo
我在使用运行v4.0的TreeView时,使用UI虚拟化仍然表现不佳。事实证明,原因是使用TreeView很容易破坏虚拟化。而ListView允许您规避这些限制。 - codekaizen
你的数据层级是否超过两个级别?如果是,每个级别是否都是不同的类型?我的数据无法正常工作,我有四个级别,每个级别都是包含下一个级别列表的不同类型。Type1包含Type2列表,Type2包含Type3列表,Type3包含Type4列表。 - Carlo
是的,我刚刚弄清楚了,我仍然想使用HierachicalDataTemplate来绑定“树”,但我意识到它实际上是一个大列表,根据级别而不是层次结构进行缩进。有趣。感谢您的建议,我会继续努力。 - Carlo
我们将采用这种方法。我做了一些原型代码,使其适用于我们的数据层次结构,到目前为止效果不错。感谢您的建议。 - Carlo

2
我们也处于类似的情况,我们尝试使用Syncfusion树形视图,但效果很差。由于没有其他第三方控件可选,也没有更好的解决方案,我们最终采用了虚拟化和按需加载(惰性加载)相结合的方式。
在我们的情况下,通常不会同时展开所有节点。这在一定程度上解决了滚动问题,并使应用程序在大多数情况下可用。尽管如此,我们仍然在寻找更好的解决方案。
值得一提的是,同时使用虚拟化和按需加载(惰性加载)也有其副作用。需要一个WPF TreeView搜索与虚拟化和按需加载示例

.

实现按需加载的一些示例:
- http://www.codeproject.com/KB/WPF/WPF_Explorer_Tree.aspx - http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/1eb3ed3d-6379-4353-9f35-2c0aecb885f2/ - http://www.telerik.com/help/wpf/radtreeview-features-load-on-demand.html

我曾尝试将虚拟化和按需加载结合起来,但不幸的是,在动态创建项时,虚拟化无法工作,只有在绑定时才能使用(至少在WPF和Telerik的TreeView上如此),因此我们不得不放弃这个选项。我们可能会展开数千个项,这意味着内存中有数千个TreeViewItems。感谢您的建议。 - Carlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接