繁体   English   中英

如何加快ListBox渲染和ListCollectionView过滤?

[英]How can I speed up ListBox rendering and ListCollectionView filtering?

这里有一个双管齐下的问题,但我认为这两个主题交织在一起足以保证它们包含在一起。

在我们的应用程序中,我们有一个ListBox ,其中填充了大量的项目。 这些项目中的每一项都显示有相当复杂的项目模板。 它必然相当复杂,虽然它可能会被削减一点,但我可能不会花费很多钱。 ListBox的项来自ListCollectionView ,它是从要显示的对象的ObservableCollection<>构造的。

我们有两个问题。

第一个是当我们为ListCollectionView重新配置过滤器并在其上调用Refresh时,在UI被拆除并重新创建时,UI中存在非常明显的几秒钟锁定,并且ListBox重新填充。 这种锁定的持续时间似乎与ListBox包含的元素数量有关,并且当ListBox的客户区域充满项目时,持续时间最长。 我们非常肯定锁定是由重新创建的项目模板引起的。 我尝试过打开虚拟化,但这对减少或消除减速没有任何影响。 我还在研究其他一些优化,比如检查我们的绑定和修改布局。 是否有任何方法可以避免这个特定问题,加快速度,或将其移动到不同的线程? (我知道最后一个是不太可能的,因为渲染都是单线程的,但也许有一些解决方法...)

第二个涉及ListCollectionView上的过滤。 虽然目前这不是一个问题,但我们认为过滤有可能成为一个问题并导致UI线程明显锁定。 我正在努力减少过滤开销,但我想知道是否有一种方法将ListCollectionView上的Refresh调用移动到另一个线程? 到目前为止,我的尝试都没有成功,似乎是因为ListCollectionView不会自动将某些事件ListCollectionView送到正确的线程上。

指出或解释这两个问题的任何已知或潜在解决方案将非常有帮助。

在一些有趣的想法 SO线程有关数据网格渲染和有约束力的-你可以将它们应用到你的列表框的情况,以及...

我不认为你可以同时虚拟化和过滤。 所以,如果我在你的鞋子里,我会坚持使用虚拟列表框并在另一个线程中执行过滤逻辑。 当然,您可能必须编写一些之前已经编写过的代码,但是如果它没有锁定您的GUI? 值得。

这里有 2个提示,第一个可能有助于虚拟化ListBox

通过将VirtualizingStackPanel用作列表的ItemsPanel来虚拟化列表和视图。 这仅在加载时创建可见元素。 所有其他元素在可见时都是惰性的。 请注意,分组或CanContentScroll="True"阻止虚拟化!

启用容器回收。 虚拟化带来了许多性能改进,但容器将被处理并重新创建,这是默认设置。 但是,通过设置VirtualizingStackPanel.VirtualizationMode="Recycling"您可以通过回收容器获得更高的性能

我通过codeproject上描述的技术对我的巨大对象列表进行了虚拟化,它运行良好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM