2010-09-17 177 views
2

沒有人有一個功能虛擬化WrapPanel我可以在WPF應用程序中使用?WPF - 虛擬化WrapPanel

我已經下載並嘗試執行http://virtualwrappanel.codeplex.com/。但是,我發現以下例外情況:

「即使將Infinity作爲可用大小傳入,元素'MyNamespace.VirtualizingWrapPanel'的佈局測量覆蓋也不應該返回PositiveInfinity作爲其DesiredSize。」

這是試圖將wrappanel應用到ListBox

回答

5

這可能時是,你可能能夠解決自己的錯誤。尋找MeasureOverride方法。它似乎總是返回傳遞給方法的availableSize。作爲例外狀態,如果包含double.PositiveInfinity,則不得返回availableSize。所以試試這個:

if(availableSize.Width == double.PositiveInfinity || availableSize.Height == double.PositiveInfinity) 
{ 
    return Size.Empty; 
} 

// all the measureoverride code comes here 

return availableSize; 

我還沒有看過詳細的實現。但是誰知道呢,如果面板在MeasureOverrideArrangeOverride之間沒有保存狀態(如果它的執行效果不好,你應該不會這麼做),否則你可能會得到這個結果。

+0

感謝bitbonk,我做了這個改變並修復了異常,但是性能似乎比正常的WrapPanel差得多。是否有任何商業虛擬化包裝可用性能良好? – devdigital 2010-09-20 09:57:06

5

這個問題很可能發生,因爲你的列表框在另一個控件中,比如堆棧面板或滾動查看器,它允許列表框增長到任意大小。雖然虛擬包裝面板在這種情況下不應該給出錯誤,但它確實解釋了性能問題。

即使使用微軟自己的虛擬化面板,也無法解決這種情況下的性能問題,因爲虛擬化失敗了。由於列表框可以增長到任意大小,因此即使它們不在屏幕上,也可以繪製所有項目,因此虛擬化不適用。

如果您確保您的列表框不在這些容器中,您應該發現虛擬化開始工作性能顯着提高。