沒有人有一個功能虛擬化WrapPanel我可以在WPF應用程序中使用?WPF - 虛擬化WrapPanel
我已經下載並嘗試執行http://virtualwrappanel.codeplex.com/。但是,我發現以下例外情況:
「即使將Infinity作爲可用大小傳入,元素'MyNamespace.VirtualizingWrapPanel'的佈局測量覆蓋也不應該返回PositiveInfinity作爲其DesiredSize。」
這是試圖將wrappanel應用到ListBox
沒有人有一個功能虛擬化WrapPanel我可以在WPF應用程序中使用?WPF - 虛擬化WrapPanel
我已經下載並嘗試執行http://virtualwrappanel.codeplex.com/。但是,我發現以下例外情況:
「即使將Infinity作爲可用大小傳入,元素'MyNamespace.VirtualizingWrapPanel'的佈局測量覆蓋也不應該返回PositiveInfinity作爲其DesiredSize。」
這是試圖將wrappanel應用到ListBox
這可能時是,你可能能夠解決自己的錯誤。尋找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;
我還沒有看過詳細的實現。但是誰知道呢,如果面板在MeasureOverride
和ArrangeOverride
之間沒有保存狀態(如果它的執行效果不好,你應該不會這麼做),否則你可能會得到這個結果。
這個問題很可能發生,因爲你的列表框在另一個控件中,比如堆棧面板或滾動查看器,它允許列表框增長到任意大小。雖然虛擬包裝面板在這種情況下不應該給出錯誤,但它確實解釋了性能問題。
即使使用微軟自己的虛擬化面板,也無法解決這種情況下的性能問題,因爲虛擬化失敗了。由於列表框可以增長到任意大小,因此即使它們不在屏幕上,也可以繪製所有項目,因此虛擬化不適用。
如果您確保您的列表框不在這些容器中,您應該發現虛擬化開始工作性能顯着提高。
感謝bitbonk,我做了這個改變並修復了異常,但是性能似乎比正常的WrapPanel差得多。是否有任何商業虛擬化包裝可用性能良好? – devdigital 2010-09-20 09:57:06