posts - 570, comments - 10448, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

背水一战 Windows 10 (58) - 控件(集合类): ListViewBase - ListView, GridView

Posted on 2017-07-13 07:54 webabcd 阅读(...) 评论(...) 编辑 收藏

[源码下载]


背水一战 Windows 10 (58) - 控件(集合类): ListViewBase - ListView, GridView



作者:webabcd


介绍
背水一战 Windows 10 之 控件(集合类 - ListViewBase)

  • ListView
  • GridView



示例
1、ListView 的示例
Controls/CollectionControl/ListViewBaseDemo/ListViewDemo.xaml

<Page
    x:Class="Windows10.Controls.CollectionControl.ListViewDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.CollectionControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"

    xmlns:common="using:Windows10.Common">

    <Page.Resources>
        <Style x:Key="ListViewItemStyle" TargetType="ListViewItem">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListViewItem">
                        <!--
                            ListViewItemPresenter - ListViewItem 的 Presenter(继承自 ContentPresenter, 请参见 /Controls/BaseControl/ContentControlDemo/ContentPresenterDemo.xaml)
                                有好多属性,详见文档
                                默认样式就是 generic.xaml 中的 <Style TargetType="ListViewItem"> 节点
                                如果需要自定义的话,那么就在 generic.xaml 中的 <Style TargetType="ListViewItem" x:Key="ListViewItemExpanded"> 节点的基础上修改
                                如果还不能满足要求的话就通过继承 ContentPresenter 来实现自定义的 ContentPresenter
                        -->
                        <!--
                            此处的 TemplatedParent 是 ListViewItem
                            这里借用 Tag 保存一下 ListViewItem 的 IsSelected,之后的数据模板可以绑定 ListViewItemPresenter 的 Tag,从而实现数据模板间接绑定 ListViewItem 的 IsSelected
                            此处通过 Tag 属性做中转,如果 Tag 有别的用处的话,那么就自己写个附加属性做中转吧
                        -->
                        <ListViewItemPresenter Margin="10" SelectedBackground="Red" SelectedPointerOverBackground="Red"
                                               Tag="{Binding IsSelected, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=TwoWay}" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <common:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </Page.Resources>

    <Grid Background="Transparent">

        <!--
            ListView - ListView 控件(继承自 ListViewBase, 请参见 /Controls/CollectionControl/ListViewBaseDemo/)
                ListView 的默认布局控件是 ItemsStackPanel,请参见 /Controls/CollectionControl/ItemsControlDemo/LayoutControl/ItemsStackPanelDemo.xaml
                ListView 的 ItemContainer 是 ListViewItem
        -->

        <ListView x:Name="listView" Margin="10 0 10 10" 
                  ItemContainerStyle="{StaticResource ListViewItemStyle}"
                  SelectionMode="Multiple"
                  ItemsSource="{x:Bind Employees}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="common:Employee">
                    <StackPanel Height="100" Width="100" Background="Blue">
                        <TextBlock x:Name="lblName" Text="{x:Bind Name}" />
                        <TextBlock x:Name="lblIsMale" Text="{x:Bind IsMale}" />
                        <!--
                            这里有个需求:当 ListViewItem 的 IsSelected 为 true 时显示,反之则不显示
                            此处的 TemplatedParent 是 ListViewItemPresenter,而不是 ListViewItem,所以需要 ListViewItemPresenter 中转一下(ListViewItemPresenter 的 TemplatedParent 是 ListViewItem)
                            此处通过 Tag 属性做中转,如果 Tag 有别的用处的话,那么就自己写个附加属性做中转吧
                        
                            如果以后 uwp 支持了 FindAncestor 的话,就可以不用中转了,直接这样写就行了
                            {Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}
                        -->
                        <TextBlock x:Name="lblAge" Text="{x:Bind Age}" 
                                   Visibility="{Binding Path=Tag, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource BooleanToVisibilityConverter}}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>


        <!--
            通过 xaml 方式为 ListView 添加 item
            <ListView>
                <ListViewItem>
                    <TextBlock Text="item1"/>
                </ListViewItem>
                <ListViewItem>
                    <TextBlock Text="item2"/>
                </ListViewItem>
                <ListViewItem>
                    <TextBlock Text="item3"/>
                </ListViewItem>
            </ListView>
        -->

    </Grid>
</Page>

Controls/CollectionControl/ListViewBaseDemo/ListViewDemo.xaml.cs

/*
 * ListView - ListView 控件(继承自 ListViewBase, 请参见 /Controls/CollectionControl/ListViewBaseDemo/)
 */

using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows10.Common;

namespace Windows10.Controls.CollectionControl
{
    public sealed partial class ListViewDemo : Page
    {
        public ObservableCollection<Employee> Employees { get; set; } = new ObservableCollection<Employee>(TestData.GetEmployees());

        public ListViewDemo()
        {
            this.InitializeComponent();
        }
    }
}


2、GridView 的示例
Controls/CollectionControl/ListViewBaseDemo/GridViewDemo.xaml

<Page
    x:Class="Windows10.Controls.CollectionControl.GridViewDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.CollectionControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    
    xmlns:common="using:Windows10.Common">

    <Page.Resources>
        <Style x:Key="GridViewItemStyle" TargetType="GridViewItem">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GridViewItem">
                        <!--
                            ListViewItemPresenter - GridViewItem 的 Presenter(继承自 ContentPresenter, 请参见 /Controls/BaseControl/ContentControlDemo/ContentPresenterDemo.xaml)
                                默认样式就是 generic.xaml 中的 <Style TargetType="GridViewItem"> 节点
                                如果需要自定义的话,那么就在 generic.xaml 中的 <Style TargetType="GridViewItem" x:Key="GridViewItemExpanded"> 节点的基础上修改
                                如果还不能满足要求的话就通过继承 ContentPresenter 来实现自定义的 ContentPresenter
                        -->
                        <ListViewItemPresenter Margin="10" SelectionCheckMarkVisualEnabled="True" SelectedBackground="Red" CheckBrush="Yellow" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Page.Resources>

    <Grid Background="Transparent">

        <!--
            GridView - GridView 控件(继承自 ListViewBase, 请参见 /Controls/CollectionControl/ListViewBaseDemo/)
                GridView 的默认布局控件是 ItemsWrapGrid,请参见 /Controls/CollectionControl/ItemsControlDemo/LayoutControl/ItemsWrapGridDemo.xaml
                GridView 的 ItemContainer 是 GridViewItem
        -->

        <GridView x:Name="gridView" Margin="10 0 10 10" 
                  ItemContainerStyle="{StaticResource GridViewItemStyle}"
                  SelectionMode="Multiple"
                  ItemsSource="{x:Bind Employees}">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="common:Employee">
                    <StackPanel Height="100" Width="100" Background="Blue">
                        <TextBlock x:Name="lblName" Text="{x:Bind Name}" Foreground="Yellow" />
                        <TextBlock x:Name="lblAge" Text="{x:Bind Age}" Foreground="Aqua" />
                        <TextBlock x:Name="lblIsMale" Text="{x:Bind IsMale}" Foreground="Gray" />
                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>

        
        <!--
            通过 xaml 方式为 GridView 添加 item
            <GridView>
                <GridViewItem>
                    <TextBlock Text="item1"/>
                </GridViewItem>
                <GridViewItem>
                    <TextBlock Text="item2"/>
                </GridViewItem>
                <GridViewItem>
                    <TextBlock Text="item3"/>
                </GridViewItem>
            </GridView>
        -->
        
    </Grid>
</Page>

Controls/CollectionControl/ListViewBaseDemo/GridViewDemo.xaml.cs

/*
 * GridView - GridView 控件(继承自 ListViewBase, 请参见 /Controls/CollectionControl/ListViewBaseDemo/)
 */

using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Controls.CollectionControl
{
    public sealed partial class GridViewDemo : Page
    {
        public ObservableCollection<Employee> Employees { get; set; } = new ObservableCollection<Employee>(TestData.GetEmployees());

        public GridViewDemo()
        {            
            this.InitializeComponent();
        }
    }
}



OK
[源码下载]