如何加快列表框呈现和列表集合视图筛选

本文关键字:列表 集合 视图 筛选 何加快 | 更新日期: 2023-09-27 17:59:39

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

在我们的应用程序中,我们有一个 ListBox ,其中填充了可能是大量项目的内容。这些项目中的每一个都显示有一个相当复杂的项目模板。它必然相当复杂,虽然它可能会减少一点,但我可能无法取出大量内容。ListBox中的项目来自一个ListCollectionView,该由要显示的对象ObservableCollection<>构成。

我们有两个问题。

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

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

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

如何加快列表框呈现和列表集合视图筛选

在这个 SO 线程中关于数据网格呈现和绑定的一些有趣的想法 - 你也可以将它们应用于你的列表框方案......

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

从这里开始的 2 个技巧,第一个可能有助于虚拟化ListBox

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

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

我通过代码项目上描述的技术对我的大量对象列表进行了虚拟化,它工作得很好