介紹
重新想象 Windows 8 Store Apps 之 ListView 和 GridView
ListView - 列表控件
GridView - 網格控件
示例
1、ListView 的 Demo
ListViewDemo.xaml
<Page x:Class="XamlDemo.Controls.ListViewDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <DataTemplate x:Key="ItemTemplate"> <StackPanel Orientation="Vertical"> <TextBlock TextWrapping="Wrap" FontSize="14.667" Text="{Binding Name}" HorizontalAlignment="Left" /> <TextBlock TextWrapping="Wrap" FontSize="14.667" Text="{Binding Age}" HorizontalAlignment="Left"/> </StackPanel> </DataTemplate> <Style x:Key="ItemContainerStyle" TargetType="ListViewItem"> <Setter Property="Width" Value="292" /> <Setter Property="Height" Value="80" /> <Setter Property="Padding" Value="0" /> <!-- 即使將 Margin 設置為“0”,也無法去掉 item 之間的 margin 如果想要去掉 item 之間的 margin,請將此 Margin 屬性設置為“-4” --> <Setter Property="Margin" Value="0" /> <Setter Property="Background" Value="Blue" /> </Style> </Page.Resources> <Grid Background="Transparent"> <Grid Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="0 30 0 0"> <CheckBox Name="chkIsSwipeEnabled" Content="IsSwipeEnabled" /> <CheckBox Name="chkIsItemClickEnabled" Content="IsItemClickEnabled" Margin="10 0 0 0" /> </StackPanel> <!--後台綁定方式為 ListView 提供數據--> <ListView x:Name="listView" Width="300" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0 60 10 10" BorderThickness="1" BorderBrush="Red" Background="LightBlue" ItemTemplate="{StaticResource ItemTemplate}" ItemContainerStyle="{StaticResource ItemContainerStyle}" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" SelectionMode="Single" SelectionChanged="listView_SelectionChanged_1" IsSwipeEnabled="{Binding IsChecked, ElementName=chkIsSwipeEnabled}" IsItemClickEnabled="{Binding IsChecked, ElementName=chkIsItemClickEnabled}" ItemClick="listView_ItemClick_1"> </ListView> <!-- xaml 方式為 ListView 添加內容 <ListView> <ListView.Items> <ListViewItem> ... </ListViewItem> <ListViewItem> ... </ListViewItem> ... </ListView.Items> </ListView> --> </Grid> </Grid> </Page>
ListViewDemo.xaml.cs
/* * ListView - 列表控件 * IsItemClickEnabled - item 是否可被點擊 * IsSwipeEnabled - 是否支持 swipe 操作(對於 ListView 來說,左右猛擊 item 稱之為 swipe) * SelectionMode - item 的選中模式(Windows.UI.Xaml.Controls.ListViewSelectionMode 枚舉) * None - 不能被選中 * Single - 只能單選 * Multiple - 僅通過鼠標多選 * Extended - 通過鼠標和輔助鍵多選(ctrl 或 shift) * SelectedItems - 被選中的 items 集合 * ItemClick - item 被單擊時觸發的事件 * SelectAll() - 選中全部 items * ScrollIntoView(object item, ScrollIntoViewAlignment alignment) - 滾動到指定的 item * ScrollIntoViewAlignment.Default - 與該 item 的最近邊緣對齊 * ScrollIntoViewAlignment.Leading - 與該 item 的前邊緣對齊 * * * 注: * IsItemClickEnabled == false && IsSwipeEnabled == false 無法響應單擊事件,單擊則意味著選中,無法 swipe * IsItemClickEnabled == true && IsSwipeEnabled == false 可以響應單擊事件,無法響應選中事件,無法 swipe * IsItemClickEnabled == false && IsSwipeEnabled == true 無法響應單擊事件,單擊和 swipe 均意味著選中 * IsItemClickEnabled == true && IsSwipeEnabled == true 可以響應單擊事件,swipe 則意味著選中 * * 關於 SemanticZoom, item的拖動, item的尺寸可變等之後通過 GridView 來介紹 * * 關於分頁加載內容在“數據綁定”一節做介紹 */ using System.Collections.Generic; using Windows.UI.Xaml.Controls; using XamlDemo.Model; namespace XamlDemo.Controls { public sealed partial class ListViewDemo : Page { public ListViewDemo() { this.InitializeComponent(); // 綁定數據 List<Employee> dataSource = TestData.GetEmployees(); listView.ItemsSource = dataSource; } // 單擊行為的事件 private void listView_ItemClick_1(object sender, ItemClickEventArgs e) { lblMsg.Text = "被單擊的 employee 的 name 為:" + (e.ClickedItem as Employee).Name; } // 選中行為的事件 private void listView_SelectionChanged_1(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0) lblMsg.Text = "此次操作被選中的 employee 的 name 為:" + (e.AddedItems[0] as Employee).Name; else lblMsg.Text = "此次操作沒有被選中的 employee"; } } }
2、GridView 的 Demo
GridView/Demo.xaml
<Page x:Class="XamlDemo.Controls.GridView.Demo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Controls.GridView" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <DataTemplate x:Key="ItemTemplate"> <StackPanel Orientation="Vertical"> <TextBlock TextWrapping="Wrap" FontSize="14.667" Text="{Binding Name}" HorizontalAlignment="Left" /> <TextBlock TextWrapping="Wrap" FontSize="14.667" Text="{Binding Age}" HorizontalAlignment="Left"/> </StackPanel> </DataTemplate> <Style x:Key="ItemContainerStyle" TargetType="GridViewItem"> <Setter Property="Width" Value="292" /> <Setter Property="Height" Value="80" /> <!-- 即使將 Margin 設置為“0”,也無法去掉 item 之間的 margin 如果想要去掉 item 之間的 margin,請將此 Margin 屬性設置為“-4” --> <Setter Property="Margin" Value="0" /> <Setter Property="Background" Value="Blue" /> </Style> <ItemsPanelTemplate x:Key="ItemsPanel"> <!-- 注:WrapGrid 繼承自 VirtualizingPanel,而 VariableSizedWrapGrid 並未繼承 VirtualizingPanel --> <WrapGrid MaximumRowsOrColumns="3" Orientation="Vertical" VerticalChildrenAlignment="Top" HorizontalChildrenAlignment="Left" /> </ItemsPanelTemplate> </Page.Resources> <Grid Background="Transparent"> <StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <StackPanel Orientation="Horizontal" Margin="0 10 0 0"> <CheckBox Name="chkIsSwipeEnabled" Content="IsSwipeEnabled" /> <CheckBox Name="chkIsItemClickEnabled" Content="IsItemClickEnabled" Margin="10 0 0 0" /> </StackPanel> <!--後台綁定方式為 ListView 提供數據--> <GridView x:Name="gridView" VerticalAlignment="Top" Margin="0 10 10 0" BorderThickness="1" BorderBrush="Red" Background="LightBlue" ItemTemplate="{StaticResource ItemTemplate}" ItemContainerStyle="{StaticResource ItemContainerStyle}" ItemsPanel="{StaticResource ItemsPanel}" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" SelectionMode="Single" SelectionChanged="gridView_SelectionChanged_1" IsSwipeEnabled="{Binding IsChecked, ElementName=chkIsSwipeEnabled}" IsItemClickEnabled="{Binding IsChecked, ElementName=chkIsItemClickEnabled}" ItemClick="gridView_ItemClick_1"> </GridView> <!-- xaml 方式為 ListView 添加內容 <GridView> <GridView.Items> <GridViewItem> ... </GridViewItem> <GridViewItem> ... </GridViewItem> ... </GridView.Items> </GridView> --> </StackPanel> </Grid> </Page>
GridView/Demo.xaml.cs
/* * GridView - 網格控件 * IsItemClickEnabled - item 是否可被點擊 * IsSwipeEnabled - 是否支持 swipe 操作(對於 GridView 來說,上下猛擊 item 稱之為 swipe) * SelectionMode - item 的選中模式(Windows.UI.Xaml.Controls.ListViewSelectionMode 枚舉) * None - 不能被選中 * Single - 只能單選 * Multiple - 僅通過鼠標多選 * Extended - 通過鼠標和輔助鍵多選(ctrl 或 shift) * SelectedItems - 被選中的 items 集合 * ItemClick - item 被單擊時觸發的事件 * SelectAll() - 選中全部 items * ScrollIntoView(object item, ScrollIntoViewAlignment alignment) - 滾動到指定的 item * ScrollIntoViewAlignment.Default - 與該 item 的最近邊緣對齊 * ScrollIntoViewAlignment.Leading - 與該 item 的前邊緣對齊 * * * 注: * IsItemClickEnabled == false && IsSwipeEnabled == false 無法響應單擊事件,單擊則意味著選中,無法 swipe * IsItemClickEnabled == true && IsSwipeEnabled == false 可以響應單擊事件,無法響應選中事件,無法 swipe * IsItemClickEnabled == false && IsSwipeEnabled == true 無法響應單擊事件,單擊和 swipe 均意味著選中 * IsItemClickEnabled == true && IsSwipeEnabled == true 可以響應單擊事件,swipe 則意味著選中 */ using System.Collections.Generic; using Windows.UI.Xaml.Controls; using XamlDemo.Model; namespace XamlDemo.Controls.GridView { public sealed partial class Demo : Page { public Demo() { this.InitializeComponent(); // 綁定數據 List<Employee> dataSource = TestData.GetEmployees(); gridView.ItemsSource = dataSource; } // 單擊行為的事件 private void gridView_ItemClick_1(object sender, ItemClickEventArgs e) { lblMsg.Text = "被單擊的 employee 的 name 為:" + (e.ClickedItem as Employee).Name; } // 選中行為的事件 private void gridView_SelectionChanged_1(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0) lblMsg.Text = "此次操作被選中的 employee 的 name 為:" + (e.AddedItems[0] as Employee).Name; else lblMsg.Text = "此次操作沒有被選中的 employee"; } } }
OK
[源碼下載]:http://files.cnblogs.com/webabcd/Windows8.rar