ListBox控件綁定數據,當滑動到底部的時候加載數據到列表上,這樣就會產生一個問題,當ListBox上面綁定的數據有幾千條的時候,界面將會卡頓,我們可以通過在ListBox上只綁定指定數量的數據,其余的都存在內存中,需要的時候再取出。假如ListBox在界面顯示部分的上面有幾百幾千條在界面之上,可以將它存儲在一個存儲空間中(上入水池),需要的時候再從里面取出。當然下面的也一樣。
當對ListBox所綁定的數據源進行Insert或Remove操作的時候,在存儲到上入水池或從上入水池取數據的時候,由於當前手機界面所顯示的那個商品會往下走或者往上走,所以需要設置ListBox中ScrollViewer的VerticalOffset。這樣才能保證界面不跳躍。但是VerticalOffset要設置偏移多少,才能不跳躍呢?經測試發現VerticalOffset的值並不是像素值,而是ListBoxItem的數量,即VerticalOffset=1時,第一個ListBoxItem的底部與在手機顯示的界面上端緊貼,第二個控件ListBoxItem在手機界面的頂部顯示出來。當ListBox里面有50條數據時,ListBox里的ScrollViewer的ScrollableHeight值就是50,ListBox划到底部的時候VerticalOffset的值就是在手機上部的ListBoxItem的數量,假如界面上有4.3個Item,那么划到底部此時的VerticalOffset的值最大只能是50-4.3=45.7。
代碼是在在ScrollViewer的狀態改變事件中進行執行,這樣比在ValueChanged進行操作要節約很多資源,只在列表停止滾動的時候 即:e.NewState.Name == "NotScrolling" 進行列表數據Remove和Insert操作。
代碼:
http://files.cnblogs.com/rentianlong/ListBoxHighEfficencyDemo.rar
只需要修改 lstPreNextMaxCount就可以限制ListBox最大的綁定數量。
我的例子里ListBox最多綁定數量不會超過150條。