WPF动态模板选择的两种实现
前言
.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动态模板选择的两种实现的更多相关文章
- 项目案例模板之jdbc两种连接方式
项目案例模板之jdbc两种连接方式 第一种连接方式 JDBCUtils.java package jdbc; import org.junit.jupiter.api.Test; import ...
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...
- js如何动态创建表格(两种方法)
js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...
- JDK动态代理(Proxy)的两种实现方式
JDK自带的Proxy动态代理两种实现方式 前提条件:JDK Proxy必须实现对象接口 so,创建一个接口文件,一个实现接口对象,一个动态代理文件 接口文件:TargetInterface.java ...
- JS动态创建元素(两种方法)
前言 创建元素有两种方法 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态 ...
- WPF内嵌网页的两种方式
在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...
- WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged
.Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial c ...
- Python3 动态导入模块的两种方式
动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块 需要导入的模块: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:C ...
- Android-PickerView【仿iOS的PickerView控件,并封装了时间选择和选项选择这两种选择器】使用
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文主要演示Android-PickerView的选项选择器.时间选择器的简单运用.由于每一个版本略有不用,所以实际使用方式以git ...
随机推荐
- springboot情操陶冶-web配置(七)
参数校验通常是OpenApi必做的操作,其会对不合法的输入做统一的校验以防止恶意的请求.本文则对参数校验这方面作下简单的分析 spring.factories 读者应该对此文件加以深刻的印象,很多sp ...
- Spring Boot 2.x (十):构建优雅的RESTful接口
RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条 ...
- 深度学习框架Keras介绍及实战
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行.Keras 的开发重点是支持快速的实验.能够以最小的时延 ...
- win2008R2环境配置
1)下载系统 [https://msdn.itellyou.cn/] 选择带sp1的,这个系统是08R2中较为完善的一种 2)安装之后首先不要激活和安装.net framework 先安装ii ...
- C# 设置Excel超链接(二)
简介 超链接能够快速地将当前文本或图片链接到指定目标地址,在日常办公中给我们提供了极大的便利.本文将介绍在C#语言中如何通过免费版组件对Excel表格添加超链接,示例中将包含以下要点: 1.添加链接到 ...
- 学JAVA第五天,今天困得要死
好不容易坚持到第五天了,继续继续!!! 今天老师没有讲JAVA的for循环,倒是讲了HTML的相关内容: 讲了JAVA代码怎么在HTML中运行. 只要在HTML加入这个 background-colo ...
- SpringDay01
Spring的控制反转 Spring的依赖注入 多种注入方式 多种属性的注入方式 <bean id="userDao" class="dao.UserDaoImpl ...
- PHP基础:MYSQL数据库操作
1.连接到数据库: · 面向对象的方法: $db = new mysqli('hostname', 'username', 'password', 'dbname'); · 面向过程的方法: $db ...
- react中的路由配置踩坑记
react 路由配置中,如果根路由(/)匹配一个组件,另一个路由(/list)在进行匹配的时候也会匹配到根路由(/),即在 /list 页面展示的时候 / 页面总是展示在上方. 此时如果想进行严格匹配 ...
- Django---forms表单使用(2)
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from dja ...