c# - 如何加速 ListBox 渲染和 ListCollectionView 过滤?

标签 c# wpf xaml optimization filtering

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

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

我们有两个问题。

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

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

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

最佳答案

this 中的一些有趣想法关于数据网格呈现和绑定(bind)的 SO 线程 - 您也可以将它们应用于您的列表框场景......

关于c# - 如何加速 ListBox 渲染和 ListCollectionView 过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6422620/

相关文章:

c# - 在主表中创建具有重命名字段和非主键的实体关系

c# - 防止类属性被序列化

wpf - XAML ResourceDictionary 相同程序集引用

c# - UWP AcrylicBrush 向后兼容最低版本 14393(周年更新)

c# - 如何获取当前的 Active Solution Platform 名称以用于 Visual Studio 加载项? (C#)

c# - 将凹面 PathGeometry 填充为凸面(找到凹面顶点并移除它们)的简单方法是什么?

c# - WPF 绑定(bind)路径=/不工作?

wpf - MEF 组件上的 ShowDialog 仅工作一次

c# - WPF 弹出窗口 : open with animation

c# - 通过 GraphQL 将任何 SQL Server 数据库变成可查询的