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

Chr*_*tle 6 c# wpf optimization xaml filtering

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

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

我们有两个问题.

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

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

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

thu*_*eys 1

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

使用VirtualizingStackPanelas ItemsPanelfor 列表来虚拟化列表和视图。这只会在加载时创建可见元素。所有其他元素在可见时都会延迟创建。请注意分组或CanContentScroll="True"阻止虚拟化!

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

我通过codeproject 上描述的技术对庞大的对象列表进行了虚拟化,效果很好