您好,登錄后才能下訂單哦!
當ListBox使用StackPanel作為容器時,如果數據源包含大量數據時,每一條數據都要創建可視化的Item來承載數據,創建這些容器就需要消耗很多時間和內存,另外滾動也非常慢,因為需要計算所有這些Item的大小和位置
如下圖所示是ListBox在默認情況下加載10000個Gamer(只定義了Id和Name屬性)對象時,IE的內存使用情況,此時滾動非常順暢:
如果我們將ListBox的ItemsPanel修改為StackPanel會如何呢?下圖是修改為StackPanel后IE的內存使用情況,此時滾動已經非常緩慢:
295264k 對 56372k,大概在5倍左右的差距,很顯然ListBox默認使用的ItemsPanel不是StackPanel,而且可以很好的處理大量的數據加載,我們不用做任何的額外處理
對于這類問題目前有兩種解決方案:
最佳的一種解決方案,其核心思想就是延遲生成每個Item,只有這些Item滾動到可視區域時才顯示這些Item,在Silverlight中UI virtualization是通過VirtualizingStackPanel來實現的,VirtualizingStackPanel計算哪些Item可見,然后只為這些可見Item創建UI元素,這樣實際創建的UI元素非常少,內存消耗就少,每次滾動時,也不需要計算每個Item的大小和位置,只需要計算哪些Item可見,然后為這些Item創建UI元素就可以了,滾動就非常順暢;VirtualizingStackPanel包含兩種模式:standard and recycling,standard模式就是每次Item進入可視區域都會重新創建UI元素,而recycling模式則會重用之前已經創建好的UI元素,使用該模式內存消耗更少,滾動更平滑
其核心思想是不一次性加載所有數據,只加載用戶可以看到的數據,比如ListBox只加載滾到可視區域的數據,在Silverlight中實現Data virtualization主要是通過PagedCollectionView實現,PagedCollectionView提供分組、排序、過濾等許多功能,使用非常靈活、方便,其核心思想就是內部維護所有Item的集合,這個集合不會和ItemsControl進行綁定,將需要在界面中展示的那些數據包裝成另外一個集合,這個集合與ItemsControl進行綁定,因為這個集合容量較小,所以實際上創建的UI元素非常少,節省內存,具體使用方法請參考MSDN,這里不再贅述
WPF中ScrollViewer提供了IsDeferredScrollingEnabled屬性支持Defer Scrolling,而Silverlight沒有暴露這個屬性不支持DeferScrolling
http://www.silverlightshow.net/items/Virtualization-in-Silverlight-4-RC.aspx
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。