title author date CreateTime categories
win10 uwp 列表模板选择器
lindexi
2019-09-02 12:57:38 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector。
如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不同,那么可以使用 列表模板选择器 来定义自己的列表,让列表中存在不同的显示。

好啦,我们先来说下我们在什么下需要使用,其实就是当我们的数据有多样,或者对数据所在位置有要求,这时需要对不同的数据做不同处理。我分为两个不同的方向来讲,第一个方向是根据数据所在的位置不同,选择不同的显示。第二个方向是根据数据的不同。

根据数据位置

本文告诉大家如何做出下面的控件,可以看到这使用的是 ListView ,但是第一个元素显示和其他的元素不同,看起来就是面包屑导航

需要定义第一个元素和其他元素的代码,于是使用 Path 做出来,因为本文不是说如何使用 Path 所以就不多说,直接写代码。

  1. <DataTemplate x:Name="OtherItem">
  2. <StackPanel x:Name="t1" Orientation="Horizontal" Margin="-12" Height="30">
  3. <Grid Height="30">
  4. <StackPanel Orientation="Horizontal" Margin="0,0,-8,0" Height="30" >
  5. <Path Data="M0,0 10,0 10,30 0,30 10,15" Fill="#000000" />
  6. <Grid Margin="-1 0 0 0">
  7. <Rectangle Fill="#000000" />
  8. <TextBlock Text="{Binding }" Margin="10,5" VerticalAlignment="Center" Foreground="White" MinWidth="60"/>
  9. </Grid>
  10. <Path Data="M0,0 10,15 0,30" Fill="#000000" />
  11. </StackPanel>
  12. </Grid>
  13. </StackPanel>
  14. </DataTemplate>
  15. <DataTemplate x:Name="FirstItem">
  16. <StackPanel x:Name="t1" Orientation="Horizontal" Margin="10 0 -12 0" Height="30">
  17. <Grid Height="30">
  18. <StackPanel Orientation="Horizontal" Margin="0,0,-7,0" Height="30" >
  19. <Grid>
  20. <Rectangle Fill="#000000" />
  21. <TextBlock Text="{Binding }" Margin="10,5" VerticalAlignment="Center" Foreground="White" MinWidth="60"/>
  22. </Grid>
  23. <Path Data="M0,0 10,15 0,30" Fill="#000000" />
  24. </StackPanel>
  25. </Grid>
  26. </StackPanel>
  27. </DataTemplate>

然后在后台定义一个类 AvmdoicYcxhqxugnSelector ,这个可以用来选择不同的模板,于是对于第一个元素,选择第一个模板,其他的元素选择其他的模板。AvmdoicYcxhqxugnSelector需要继承DataTemplateSelector重写方法,通过重写SelectTemplateCore可以选择不同的DataTemplate,但是AvmdoicYcxhqxugnSelector需要两个属性才可以获得这两个DataTemplate所以代码很简单。

  1. public class AvmdoicYcxhqxugnSelector : DataTemplateSelector
  2. {
  3. public DataTemplate FirstItem { get; set; }
  4. public DataTemplate OtherItem { get; set; }
  5.  
  6. protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
  7. {
  8. var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
  9. return (itemsControl.IndexFromContainer(container) == 0) ? FirstItem : OtherItem;
  10. }
  11. }

然后就是创建一个 ListView 用来显示元素,还需要一个数据,于是所有的代码就是:

  1. <local:AvmdoicYcxhqxugnSelector x:Key="Selector" FirstItem="{StaticResource FirstItem}" OtherItem="{StaticResource OtherItem}"></local:AvmdoicYcxhqxugnSelector>
  2. <ListView Margin="10,10,10,10" ItemsSource="{x:Bind SkaxicIjocc}" ItemTemplateSelector="{StaticResource Selector}">
  3. <ListView.ItemsPanel>
  4. <ItemsPanelTemplate>
  5. <StackPanel Orientation="Horizontal" />
  6. </ItemsPanelTemplate>
  7. </ListView.ItemsPanel>
  8. </ListView>
  9. public sealed partial class MainPage : Page
  10. {
  11. public MainPage()
  12. {
  13. this.InitializeComponent();
  14. }
  15.  
  16. public ObservableCollection<string> SkaxicIjocc { get; set; } = new ObservableCollection<string>()
  17. {
  18. "lindexi","csdn","cnblogs","自己博客","加班"
  19. };
  20. }

但是这样看起来还是不是我要的,把鼠标放上去,发现出现背景

如何去背景请看win10 UWP ListView

就是把ListViewItem复制,然后去掉ListViewItemBackgroundPointerOverSelectedBackground SelectedPointerOverBackground 就好了。实际把很多属性去掉就可以做出比较好的效果,但是选中的修改颜色还需要后台写。这是我修改的 Template 可以直接复制使用。

  1. <ListViewItemPresenter
  2. ContentTransitions="{TemplateBinding ContentTransitions}"
  3. SelectionCheckMarkVisualEnabled="False"
  4. CheckBrush="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
  5. CheckBoxBrush="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
  6. DragBackground="{ThemeResource ListViewItemDragBackgroundThemeBrush}"
  7. DragForeground="{ThemeResource ListViewItemDragForegroundThemeBrush}"
  8. FocusBorderBrush="{ThemeResource SystemControlForegroundAltHighBrush}"
  9. FocusSecondaryBorderBrush="{ThemeResource SystemControlForegroundBaseHighBrush}"
  10. PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}"
  11. DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
  12. DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}"
  13. ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
  14. HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
  15. VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
  16. ContentMargin="{TemplateBinding Padding}"
  17. CheckMode="Inline"/>

下面来告诉大家使用不同的数据,如何对不同的数据有特殊显示。

根据不同的数据

例如我们做了一个类,叫做 人,这时我们继承人做出来 男生 和女生,那么男生的属性可能和女生的不同。所以需要对不同的数据有特殊的显示。

假设我们的 人 有个属性叫做名称,而男生有个属性叫身高,女孩有个属性叫年龄,当然女生年龄放出来并不好,不过我也没找到别的。这时需要显示男生的身高和女生的年龄,可以看到这时的 DataTemplate 难以按照不同的数据显示。于是接下来,我就告诉大家如何让列表显示不同的数据。

好啦,我们在ViewModel放一个ObservableCollection<Human> HumanWord,这时我们发现,在前台不好弄,如何让列表显示男生和女孩,因为他们的属性不同。

这时就需要我们做选择器,这个可以根据我们传入选择模板。

首先我们建立一个类,这个类用于选择需要显示的 DataTemplate ,名称:ListViewDataTemplateSelector 需要继承 DataTemplateSelector 。这个类需要有两个 DataTemplate 一个显示 男生,一个显示女生,其中DataTemplate会在 xaml 写,不会在 cs 写,因为在这里写难度有些高。

  1. public DataTemplate MaleData { set; get; }
  2.  
  3. public DataTemplate FemaleData { set; get; }

然后我们判断我们是否传进来是男生,如果是就返回 MaleData ,女生就返回女生的DataTemplate,这时需要 override SelectTemplateCore。可以看到这个方法重载有两个,如果我们的 ItemsPanelItemsStackPanel 或 ItemsWrapGrid 我们就需要选择 SelectTemplateCore(Object) 。如果我们的 VirtualizingStackPanel 或其他的WrapGrid ,就是 SelectTemplateCore(Object, DependencyObject)。请看代码,很简单判断是男生还是女生。

  1. protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
  2. {
  3. if (item is Male)
  4. {
  5. return MaleData;
  6. }
  7. return FemaleData;
  8. }

下面就是如何使用这个类,首先需要在 xaml 先写出两个 DataTemplate 。需要注意的是DataTemplate 和选择器都是资源,因为资源的获取是有顺序,所以需要先写DataTemplate,而且需要给DataTemplate一个 key 。然后在写ListViewDataTemplateSelector,把刚才写的DataTemplate放在ListViewDataTemplateSelector的属性FemaleData,MaleData 。注意ListViewDataTemplateSelector也需要key,关于资源的寻找,参见win10 uwp x:Bind 无法获得资源
一定要有key,然后在ListViewDataTemplateSelector放在FemaleData,MaleData,注意也要key,随便给个名称都好。

  1. <DataTemplate x:Key="MaleData">
  2. <Grid>
  3. <Border>
  4. <Grid Margin="10,10,10,10">
  5. <StackPanel>
  6. <TextBlock Text="名称"></TextBlock>
  7. <TextBlock Text="{Binding Path=Name}"></TextBlock>
  8. <TextBlock Text="身高"></TextBlock>
  9. <TextBlock Text="{Binding Path=Stature}"></TextBlock>
  10. </StackPanel>
  11. </Grid>
  12. </Border>
  13. </Grid>
  14. </DataTemplate>
  15. <DataTemplate x:Key="FemaleData">
  16. <Grid>
  17. <Border>
  18. <Grid Margin="10,10,10,10">
  19. <StackPanel>
  20. <TextBlock Text="名称"></TextBlock>
  21. <TextBlock Text="{Binding Path=Name}"></TextBlock>
  22. <TextBlock Text="年龄"></TextBlock>
  23. <TextBlock Text="{Binding Path=Year}"></TextBlock>
  24. </StackPanel>
  25. </Grid>
  26. </Border>
  27. </Grid>
  28. </DataTemplate>
  29. <local:ListViewDataTemplateSelector x:Key="Selector" FemaleData="{StaticResource FemaleData}"
  30. MaleData="{StaticResource MaleData}"></local:ListViewDataTemplateSelector>

在需要使用的ListView就可以指定资源,相信大家也知道如何用。

  1. <ListView ItemsSource="{x:Bind View.HumanWorld}"
  2. ItemTemplateSelector="{StaticResource Selector}"></ListView>

如果使用的数据,传入的列是男生的,那么就会使用MaleData,于是就可以对不同的数据使用不同的DataTemplate。上面的例子只是很简单使用两个不同的数据,如果有很多不同的数据,或者数据里,需要按照数据内容,进行自定义的显示,那么使用选择器也是可以做到。

源代码:https://github.com/lindexi/kechengbiao

如果需要所有源代码,请联系我因为现在csdn上传需要审查,总是无法上传

参见:win10 uwp 如何使用DataTemplate

2019-9-2-win10-uwp-列表模板选择器的更多相关文章

  1. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  2. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  3. 2019-11-29-win10-uwp-列表模板选择器

    原文:2019-11-29-win10-uwp-列表模板选择器 title author date CreateTime categories win10 uwp 列表模板选择器 lindexi 20 ...

  4. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  5. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  6. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  7. win10 uwp 如何使用DataTemplate

    这是数据模板,一般用在数组的绑定,显示数组中的元素. 假如我们有一个列表,列表里是书,包括书名.作者.还有出版,那么我们只有源信息,如何把它显示到我们的ListView,就需要DataTemplate ...

  8. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  9. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

随机推荐

  1. linux 添加文字、图形、线条、箭头的 截图

    1.deepin-screenshot 截图 软件包里搜索deepin-screenshot 支持添加文字.图形.线条.箭头的功能 2.字体发虚 Linux mint 开始菜单等字体不清晰 在软件管理 ...

  2. iPhone开发之深入浅出 (7) — ARC总结

    原文链接:http://www.yifeiyang.net/development-of-the-iphone-simply-7/ 通过前面几篇文章的介绍,我想大家应该对ARC有了一个比较完整的理解. ...

  3. linux C 编译时手动链接遇到的问题(未解决)

    写多线程的时候,编译的时候遇到了问题,开始的时候是这样的: 编译器不认识pthread_create和pthread_join这两个函数. 搜了一下原因是没有链接相应的库,下面是我看到一个博友写的: ...

  4. Directx11教程(3) 一个最基本D3D应用程序(1)

    原文:Directx11教程(3) 一个最基本D3D应用程序(1)       在前一篇教程程序代码的基础上,这次我们将增加2个类: InputClass,键盘处理的代码将放在这个类里面,Graphi ...

  5. day39-Spring 18-Spring的JDBC模板:查询的操作

    package cn.itcast.spring3.demo2; import java.sql.ResultSet; import java.sql.SQLException; import jav ...

  6. js函数易犯的错误

    1.定义一个js函数时不能写在另一个函数里面. 2.定义一个打开网页自动执行的函数,一定要注意加载的顺序.如果是不是自动执行的,而是等页面加载完后事件触发的,那写在任何地方都没问题. 错误的:

  7. LayUI+Echart实现图表

    1.首先 定义一个容器存放图表  需要指定这个容器的大小 <div class="layui-card"> <div class="layui-card ...

  8. hdu5438 dfs+并查集 长春网赛

    先dfs对度小于2的删边,知道不能删为止. 然后通过并查集来计算每一个分量里面几个元素. #include<iostream> #include<cstring> #inclu ...

  9. python 顺序传入

  10. Maven启用代理访问

    如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配置文件中设置代理服务器: ...