簡體   English   中英

如何加快ListBox渲染和ListCollectionView過濾?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM