在前篇《淺談ListBox在Windows Phone 7 中的使用》 中大致介紹了ListBox在Windows Phone 7的用法,今天將繼續深究ListBox。主題是ListBox的效能問題。
我相信,如果大家將自己的Windows Phone 部署到phone 7真機或多或少會遇到效能上的問題,當然這也是模擬器和真實裝置區別之一,而這些問題很大程度上是ListBox的渲染以及從web上下載圖片造成的。這裡有一篇微軟WP7團隊提供的關於ListBox效能的文章,還是值得大家一看的,裡面是微軟WP7團隊對如何最佳化windows phone 程式給出的建議。是Colin Eberhardt對NoDo做的效能測試,可以發現,ItemsControl可以在更短的時間內提供類似ListBox的功能。
我們在真實機上測試的時候,可能會遇到的一個問題就是當我從一個頁面跳到另一個頁面,而在這個頁面中有有一個比較複雜的UI(比如說ListBox中有100條資料,而且ListBox應用的模板相對複雜)。這時候我們的程式感覺像死掉了,介面一動不動。小七很無辜的說道,我還沒死,我只是在載入資料和渲染介面,等我弄好了我就活過來了,請耐心等我1分鐘。使用者能夠等1分鐘嗎? 這會給使用者帶來很不好的體驗。國外有研究說全景布局控制項(Panorama控制項)載入會消耗大約1.6秒!
當應用程式啟動的時候,有啟動畫面會告知使用者程式正在啟動,而我們在切換頁面的時候,也可以加上類似的效果,告訴使用者,請稍等,我正在載入。國外大牛Colin Eberhardt 就提供了一種不錯的想法,叫延長載入(DeferredLoadContentControl),以下是兩種載入的使用者比對圖
具體的代碼可以參考 DeferredLoadContentControl.zip
如果你的ListBox中的項目比較複雜,建議使用LazyListBox,一種在滑動時使用簡單模板,在停止滑動時再換為正常(即複雜UI)的模板,具體的可以參考 http://blogs.msdn.com/b/ptorr/archive/2010/10/12/procrastination-ftw-lazylistbox-should-improve-your-scrolling-performance-and-responsiveness.aspx
在mango中,windows phone team已經對ListBox做了最佳化,如果你的ListBox中有圖片,它會啟用後台線程去處理,如果你已經升到Mango,那麼你可以看看ListBox有什麼改變,或者你也可以再將LazyListBox替換為ListBox.....
PS:這篇文章在草稿箱存了一月有餘,今天抽了點時間整理髮布...