前言
.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 ...
随机推荐
-
nginx端口占用案例分享
这里分享一个案例,问题的原因是反向代理使用不当. 现象 首先描述一下问题的现象.当时的问题是应用启动失败,日志里面报错显示端口占用.我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题.那么同 ...
-
基础笔记(三):网络协议之Tcp、Http
目录 一.网络协议 二.TCP(Transmission Control Protocol,传输控制协议) TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三.HTTP(Hyper ...
-
GNURadio For Windows编译安装脚本v1.1.1发布
GNURadio也能在Windows上运行了,安装GNURadio时,会自动化下载一系列powershell脚本,在源里进行build.然后它依赖为64位原生二进制文件,使用Visual Studio ...
-
Z - 不容易系列之(3)―― LELE的RPG难题
Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深C ...
-
《火球——UML大战需求分析》(0.1)——开篇废话
说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...
-
配置文件http://www.cnblogs.com/Jevon-ran/p/7112007.html
author:JevonWei 版权声明:原创作品 /etc/centos-release 记录系统版本信息 /etc/issue 系统登录前提示信息 /etc/motd 系统登陆后提示信息 /etc ...
-
python -----一个简单的小程序(监控电脑内存,cpu,硬盘)
一个简单的小程序 用函数实现!~~ 实现: cpu 使用率大于百分之50 时 , C 盘容量不足5 G 时, 内存 低于2G 时. 出现以上其中一种情况,发送自动报警邮件! 主要运用 到了两个 模 ...
-
通过$.ajax设置预加载动画加强用户体验
以前在jquery请求数据时,总喜欢用简洁的$.get与$.post提交数据,但有时发现由于网速的问题,有些时候网站加载js获得的数据会非常慢,于是就想能不能请求数据中间,给加载数据一个提示,增加用户 ...
-
js使用锚点回到顶部
使用锚点链接是一种简单的返回顶部的功能实现.该实现主要在页面顶部放置一个指定名称的锚点链接,然后在页面下方放置一个返回到该锚点的链接,用户点击该链接即可返回到该锚点所在的顶部位置 <body s ...
-
topcoder srm 335 div1
problem1 link 直接模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; public ...