繼基礎繫結後,本文深入探討 Windows 8 中最常用的集合控制項:ListView 與 GridView,以及進階的分組顯示與 SemanticZoom 語意縮放功能。
| 特性 | ListView | GridView |
|---|---|---|
| 排列方式 | 垂直堆疊 (列表) | 平行堆疊 (網格) |
| 適用場景 | 簡潔清單、郵件列表、設定選項 | 相簿、產品目錄、媒體庫 |
| 基底類別 | ItemsControl | ItemsControl |
| 預設面板 | VirtualizingStackPanel | WrapGrid |
<Page.Resources>
<DataTemplate x:Key="ContactTemplate">
<Grid Margin="10">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Thumbnail}" Height="60" Width="60" Margin="0,0,10,0"/>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Email}" Style="{StaticResource ContactEmailStyle}"/>
<TextBlock Text="{Binding Author}" Style="{StaticResource ContactAuthorStyle}"/>
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
<Style x:Key="ContactEmailStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="18"/>
</Style>
<Style x:Key="ContactAuthorStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</Page.Resources>
<ListView x:Name="lvMainListView"
ItemTemplate="{StaticResource ContactTemplate}"
SelectionMode="Single"
SelectionChanged="lvMainListView_SelectionChanged_1" />
private ObservableCollection Contacts = new ObservableCollection();
private void LoadContacts()
{
Contacts.Add(new Contact
{
Email = "qq34506@hotmail.com",
Author = "Kevin Fan",
Thumbnail = new BitmapImage(new Uri("ms-appx:///Assets/60Mail01.png"))
});
// ...更多聯絡人
lvMainListView.ItemsSource = Contacts;
}
<Page.Resources>
<ItemsPanelTemplate x:Key="GridViewItemsPanel">
<WrapGrid MaximumRowsOrColumns="2" />
</ItemsPanelTemplate>
</Page.Resources>
<GridView x:Name="gvMainGridView"
ItemTemplate="{StaticResource ContactTemplate}"
ItemsPanel="{StaticResource GridViewItemsPanel}"
SelectionMode="Single"
SelectionChanged="gvMainGridView_SelectionChanged_1" />
<GridView x:Name="gvMainGridView" ...>
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text='{Binding Role}' Foreground="White" FontSize="25" Margin="5" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
private List AllContacts = new List();
private CollectionViewSource ContactCollection = new CollectionViewSource
{
IsSourceGrouped = true,
ItemsPath = new PropertyPath("Contacts")
};
public MainPage()
{
this.InitializeComponent();
LoadContacts();
var groupedContacts = AllContacts
.GroupBy(x => x.Role)
.Select(x => new GroupContactList { Role = x.Key, Contacts = x.ToList() });
ContactCollection.Source = groupedContacts.ToList();
gvMainGridView.ItemsSource = ContactCollection.View;
}
public class GroupContactList
{
public string Role { get; set; }
public List Contacts { get; set; }
}
結合縮放視圖與分組導航:
<SemanticZoom x:Name="MainZoomControl">
<!-- 縮小時檢視:群組標題總覽 -->
<SemanticZoom.ZoomedOutView>
<GridView x:Name="gvZoomedOutGridView"
ItemTemplate="{StaticResource ZoomedOutBookTemplate}">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</SemanticZoom.ZoomedOutView>
<!-- 放大時檢視:詳細分組內容 -->
<SemanticZoom.ZoomedInView>
<GridView x:Name="gvZoomedInGridView"
ItemTemplate="{StaticResource ContactTemplate}"
ItemsPanel="{StaticResource GridViewItemsPanel}"
ItemsSource="{Binding Source={StaticResource ContactCollection}}">
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text='{Binding Role}' Foreground="White" FontSize="25" Margin="5" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Vertical" Height="400" />
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
</SemanticZoom.ZoomedInView>
</SemanticZoom>
gvZoomedOutGridView.ItemsSource = ContactCollection.View.CollectionGroups;
CollectionViewSource.IsSourceGrouped:啟用分組CollectionViewSource.ItemsPath:指定群組內項目屬性路徑GroupStyle.HeaderTemplate:群組標題樣板GroupStyle.Panel:群組內項目排列面板SemanticZoom.ZoomedInView/ZoomedOutView:雙視圖模式VariableSizedWrapGrid:支援跨行跨列的彈性網格Win8DataBinding.zip - 完整進階繫結範例專案