前言

 .net开发工作了六年,看了大量的博客,现在想开始自己写博客,这是我的第一篇博客,试试水,就从自己最常使用的WPF开始。

  今天我来给大家分享可用户动态选择控件模板的两种实现方式:DataTrigger实现;TemplateSelector实现。

  DataTrigger实现

要通过datatrigger实现动态选择控件Template,首先我们得为控件定义一个Style,直接对style进行Trigger设置,如下:

  <Style TargetType="ListBoxItem">
<Style.Triggers>
。。。。。
</Style.Triggers>
</Style>

  因为对于DataTrigger的Setter,我们能够进行设置的Template是ControlTemplate,所以我们需要添加控件ControlTemplate资源

             <!--字符串-->
<ControlTemplate x:Key="textTemplate">
<Border Height="20" Margin="5" Background="#F8F8F8">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Content}"/>
</Border>
</ControlTemplate>
<!--图片-->
<ControlTemplate x:Key="imageTemplate">
<Border Background="#F8F8F8" Margin="5">
<Image MaxHeight="100" HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="100" Stretch="Uniform" Source="{Binding Content}"/>
</Border>
</ControlTemplate>
<!--文件-->
<ControlTemplate x:Key="fileTemplate">
<Border Background="#F8F8F8" Margin="5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<Image Height="30" Width="30" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Source="file.ico"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Content,Converter={StaticResource FilePathToNameConverter}}"/>
</StackPanel>
</Border>
</ControlTemplate>

    接下来就是关键部分,我们需要把Style补全,如下:

  <Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding ItemType}" Value="text">
<Setter Property="Template" Value="{StaticResource textTemplate}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ItemType}" Value="image">
<Setter Property="Template" Value="{StaticResource imageTemplate}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ItemType}" Value="file">
<Setter Property="Template" Value="{StaticResource fileTemplate}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>

  此处显示指定了TargetType,对于其他类型控件也可通过key进行手动设置style。

  TemplateSelector实现

  该部分就简单描述一下,首先需要创建DataTemplateSelector的子类,顾名思义,该选择器仅能支持对DataTemplate的选择。

 public class ItemTemplateSelector : DataTemplateSelector
{
public DataTemplate TextTemplate { get; set; }
public DataTemplate ImageTemplate { get; set; }
public DataTemplate FileTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var listitem = item as ListItem;
if (listitem == null) return TextTemplate;
switch (listitem.ItemType)
{
case itemtype.text:
return TextTemplate;
case itemtype.image:
return ImageTemplate;
case itemtype.file:
return FileTemplate;
}
return base.SelectTemplate(item, container);
}
}

并在xaml的资源中添加datatemplate资源及DataTemplateSelector资源

  <!--字符串-->
<DataTemplate x:Key="textTemplate">
<Border Height="" Margin="" Background="#F8F8F8">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Content}"/>
</Border>
</DataTemplate>
<!--图片-->
<DataTemplate x:Key="imageTemplate">
<Border Background="#F8F8F8" Margin="">
<Image MaxHeight="" HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="" Stretch="Uniform" Source="{Binding Content}"/>
</Border>
</DataTemplate>
<!--文件-->
<DataTemplate x:Key="fileTemplate">
<Border Background="#F8F8F8" Margin="">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<Image Height="" Width="" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Source="file.ico"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Content,Converter={StaticResource FilePathToNameConverter}}"/>
</StackPanel>
</Border>
</DataTemplate> <local:ItemTemplateSelector x:Key="selector1"
TextTemplate ="{StaticResource textTemplate}"
ImageTemplate="{StaticResource imageTemplate}"
FileTemplate="{StaticResource fileTemplate}"/>

完成该操作后只需对ListView设置ItemTemplateSelector即可。

WPF动态模板选择的两种实现的更多相关文章

  1. 项目案例模板之jdbc两种连接方式

    项目案例模板之jdbc两种连接方式 第一种连接方式 JDBCUtils.java package jdbc; ​ import org.junit.jupiter.api.Test; ​ import ...

  2. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  3. js如何动态创建表格(两种方法)

    js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...

  4. JDK动态代理(Proxy)的两种实现方式

    JDK自带的Proxy动态代理两种实现方式 前提条件:JDK Proxy必须实现对象接口 so,创建一个接口文件,一个实现接口对象,一个动态代理文件 接口文件:TargetInterface.java ...

  5. JS动态创建元素(两种方法)

    前言 创建元素有两种方法 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态 ...

  6. WPF内嵌网页的两种方式

    在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...

  7. WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged

    .Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...

  8. Python3 动态导入模块的两种方式

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块 需要导入的模块: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:C ...

  9. Android-PickerView【仿iOS的PickerView控件,并封装了时间选择和选项选择这两种选择器】使用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文主要演示Android-PickerView的选项选择器.时间选择器的简单运用.由于每一个版本略有不用,所以实际使用方式以git ...

随机推荐

  1. Linux和Shell回炉复习系列文章总目录

    本页内容都是本人回炉Linux时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接右上角叉 ...

  2. webpack4.0各个击破(3)—— Assets篇

    目录 一. Assets资源的基本处理需求 二. webpack处理引用资源 2.1 资源打标 2.2 引用优化 2.3 sprites雪碧图合成 2.4 图片压缩及其他 webpack作为前端最火的 ...

  3. 服务器SSH连接时间设置

    用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,造成这个问题的原因便是SSH服务有自己独特的会话连接机制. 解决方案: 1.设置服务器向SSH客户端连接会话发送频率和时间 v ...

  4. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上快速实现CandleStickChart控件

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  5. DSAPI HTTP监听服务端与客户端

    本文中,演示了使用DSAPI.网络相关.HTTP监听,快速建立服务端和客户端. HTTP监听服务端的作用,是监听指定计算机端口,以实现与IIS相同的解析服务,提供客户端的网页请求,当然,这不仅仅是应用 ...

  6. Java的几道面试题目以及简短回答做个记录保存

      最近没有继续用CSDN写博客了,转到博客园,什么时候自己搭建一个博客就好了. 一 谈谈你对Spring的工作原理的理解 引用一篇博客的讲解,https://www.cnblogs.com/xdp- ...

  7. Java学习笔记之——IO

    一. IO IO读写 流分类: 按照方向:输入流(读),输出流(写) 按照数据单位:字节流(传输时以字节为单位),字符流(传输时以字符为单位) 按照功能:节点流,过滤流 四个抽象类: InputStr ...

  8. 我的AI之路

    本篇文章会列出在学习AI的路上所读的一些书籍或者其他一些相关内容,主要是用来监督自己,希望自己能够在AI学习上坚持下去. <机器学习 - 周志华> 绪论本章以西瓜为例子,简单的介绍了机器学 ...

  9. 用node.js express设置路径后 子路径下的页面访问静态资源路径出问题

    在routes/news_mian.js 设置了访问news_main.html 的路径 '/',通知设置一个访问news-page.html的子路径'/newspage'子路径.但是在访问loacl ...

  10. springboot之配置文件

    springboot在加载配置文件的时候是有先后顺序的,了解加载配置文件的先后顺序,可以减少编写程序出现错误 1 springboot加载配置文件的先后顺序如下: SpringApplication将 ...