[英]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.