Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何加快ListBox渲染和ListCollectionView过滤?_C#_Wpf_Xaml_Optimization_Filtering - Fatal编程技术网

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

C# 如何加快ListBox渲染和ListCollectionView过滤?,c#,wpf,xaml,optimization,filtering,C#,Wpf,Xaml,Optimization,Filtering,这是一个双管齐下的问题,但我认为这两个主题相互交织在一起,足以保证将它们包含在一起 在我们的应用程序中,我们有一个列表框,其中填充了大量的项目。这些项目中的每一项都使用相当复杂的项目模板显示。这必然相当复杂,虽然它可能会被削减一点,但我可能无法拿出大量。ListBox中的项目来自一个ListCollectionView,该视图由要显示的对象的observeCollection构成 我们有两个问题 首先,当我们为ListCollectionView重新配置过滤器并在其上调用Refresh时,用户界

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

在我们的应用程序中,我们有一个
列表框
,其中填充了大量的项目。这些项目中的每一项都使用相当复杂的项目模板显示。这必然相当复杂,虽然它可能会被削减一点,但我可能无法拿出大量。
ListBox
中的项目来自一个
ListCollectionView
,该视图由要显示的对象的
observeCollection
构成

我们有两个问题

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

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

指向或解释这两个问题的任何已知或潜在解决方案都会非常有用。

2来自的提示,第一个可能有助于虚拟化
列表框:

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

启用容器回收。虚拟化带来了很多性能改进,但是容器将被丢弃并重新创建,这是默认情况。但通过设置
virtualizationstackpanel.VirtualizationMode=“Recycling”


我用所描述的技术对我庞大的对象列表进行了虚拟化,它工作得很好

关于数据网格渲染和绑定的一些有趣的想法-您可以将它们应用到您的列表框场景中…

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

这是一篇有趣的文章。当我们读取列表框中显示的对象时,它可能会很有用;我将研究如何实现它。关于VirtualizingStackPanel:我已经设置好了,但不幸的是,它没有解决ListBox暂停问题。不过,谢谢。原始海报中有一个涉及ListCollectionView的有效问题,并且已经启用了虚拟化。我遇到了同样的问题:刷新似乎是要重新创建项目。我已经确认虚拟化通过滚动工作,但是当我使用视图进行筛选或排序时,WPF在ListView中重新创建了所有项目。我认为如果我们添加或删除项目,这可能是一个潜在的解决方案。但在应用过滤器时,似乎必须重新填充列表框。如果这是不可避免的,那么随之而来的摊位也是不可避免的,这有点令人讨厌。WPF的单线程渲染的症状。希望将来会有一些补救办法。目前,我想我必须尝试进一步优化我们的数据模板。干杯。我的wpf项目也有同样的问题。你找到解决方案了吗?已经有一段时间了:)我似乎记得我们确实积极地优化了模板,并重构了过滤,将大部分内容转移到另一个线程上。这使得锁不那么引人注目。不幸的是,从那以后我换了工作,所以我不知道是否还有进一步的工作要做。这可能是因为他们已经切换到了第三方
列表框
,类似于性能更好的控件,我们为网格做了这些。