在Windows Phone 7 Tips (5) 中曾經提到,在Windows Phone 7 中頁面的布局一般分為:Panoramic、Pivot、List和Full Screen。而通常List的實現方式就是ListBox。
一、什麼是ListBox?
ListBox 是一個顯示項目集合的控制項。一次可以顯示 ListBox 中的多個項。
ListBox繼承自ItemsControl,可以使用Items或者ItemsSource設定其內容。
二、在ListBox中顯示資料
我們可以通過兩種方式在ListBox中顯示:直接內嵌ListBoxItem(或其他UIElement,如TextBlock等) 與資料繫結(90%情況下均為資料繫結實現)。
1.直接內嵌ListBox範例程式碼如下:
2.資料繫結的範例程式碼如下:
XAML代碼 :
後置代碼:
最終的現實效果都是一樣的,如:
三、 如果擷取ListBox的ItemTemplate/DataTemplate 中指定的控制項
當我們使用資料繫結的控制項,比如說ListBox,我們通常會自訂ListBox的模板(一般建議使用Blend工具修改模板),而在某些情況下,我們需要擷取DataTemplate中的某一控制項,以對其做一些特定的操作。那我們如何擷取呢?事實上,我們可以使用VisualTreeHelper 類來擷取指定的控制項。下面是具體的Demo:
前台XAML代碼:
後置代碼代碼:
四、ListBox 效能相關
在Silverlight中,為了將資料顯示給使用者,我們需要載入資料和綁定資料,但是哪個會導致效能問題呢?答案是:根據你的資料類型以及介面(UI)的複雜性而定。
通常,載入資料可以在UI線程或者後台線程中實現,資料存在的形式也不經相同,有的序列化為位元據,有的序列化為XML檔案,有的則是圖片形式存在等等。而資料繫結又有三種不同的綁定形式:一次綁定(One Time)、單向綁定(One Way)和雙向繫結(Two Way)。
這裡簡單介紹下什麼是VSP(VirtualizingStackPanel)
MSDN解釋為:將內容排列和虛擬化在一行上,方向為水平或垂直。“虛擬化”是指一種技術,通過該技術,可根據螢幕上所顯示的項來從大量資料項目中產生user interface (UI) 元素的子集。僅當 StackPanel 中包含的項控制項建立自己的項容器時,才會在該面板中發生虛擬化。 可以使用資料繫結來確保發生這一過程。 如果建立項容器並將其添加到項控制項中,則與 StackPanel 相比,VirtualizingStackPanel 不能提供任何效能優勢。
VirtualizingStackPanel 是 ListBox 元素的預設項宿主。 預設情況下,IsVirtualizing 屬性設定為 true。當 IsVirtualizing 設定為 false 時,VirtualizingStackPanel 的行為與普通 StackPanel 一樣。
我們可以將VSP理解為當需要時,VSP會產生容器物件,而當對象不在可視範圍內時,VSP就把這些對象從記憶體中移除。當ListBox很想當大資料量的項目時,我們不需要將不在可視範圍中的對象載入到記憶體中,從而解決了記憶體的問題。另外VSP有一個屬性CacheMode設定緩衝表示形式,預設設為Standard。當我們需要迴圈顯示,可以將其設定為Recycling。
在ListBox中使用VSP來進行資料虛擬化時,我們需要注意以下幾點:
1. 確保在DataTemplate 中的容器(如Grid)大小固定
2. 在資料對象可以提供相應值時,盡量避免使用複雜的轉換器(Converter)
3. 不要在ListBox中內嵌ListBox
4. 強烈推薦不要在DataTemplate中使用使用者控制項
5. 在DataTemplate中不要使用自訂控制項
以上是對ListBox的一個簡單介紹,在以後的部落格中將會繼續深入ListBox。