前言

 .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. 2018年Fintech金融科技关键词和入行互金从业必懂知识

    2018年过去大半,诸多关键词进入眼帘: 5G,消费降级,数据裸奔,新零售,AI,物联网,云计算,合规监管,风控,割韭菜,区块链,生物识别,国民空闲时间以及金融科技. 这些词充斥着我们的生活和时间,而 ...

  2. Shell从入门到精通进阶之二:Shell字符串处理之${}

    上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ...

  3. [十一]JavaIO之DataInputStream 和 DataOutputStream

    功能简介 DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStrea ...

  4. Select默认选择后台参数

    之前写过一个这样的方法,后来需求开发中,发现了方法的BUG,然后我又重新找了一种方法,今天来记录一下. 先声明前台 <select name="type" class=&qu ...

  5. jquery/js知识点收藏

    1]关于页面跳转 "window.location.href"."location.href"是本页面跳转 "parent.location.href ...

  6. C# 如何创建Excel多级分组

    在Excel中如果能够将具有多级明细的数据进行分组显示,可以清晰地展示数据表格的整体结构,使整个文档具有一定层次感.根据需要设置显示或者隐藏分类数据下的详细信息,在便于数据查看.管理的同时也使文档更具 ...

  7. Java开发笔记(五)数值变量的类型

    如今个人电脑的配置越来越高,内存和硬盘的容量大小都是以G为单位,而1G=1024M=1024*1024K=1024*1024*1024字节.不过在PC的早期发展阶段,电脑的存储空间却是十分有限的,像2 ...

  8. 2018.12/17 function 的闭包

    1.闭包:函数在调用的时候会形成一个私有的作用域,对内部变量起到保护的作用,这就是闭包. 2.变量销毁: 1.人为销毁  var a=12; a=null 2.自然销毁  函数调用完成之后 浏览器会自 ...

  9. jQuery中each循环的跳出和结束

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  10. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...