前言

 .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. python学习第三讲,python基础语法之注释,算数运算符,变量.

    目录 python学习第三讲,python基础语法之注释,算数运算符,变量. 一丶python中的基础语法,注释,算数运算符,变量 1.python中的注释 2.python中的运算符. 3.pyth ...

  2. 10年架构师告诉你,他眼中的Spring容器是什么样子的

    相关文章 如何慢慢地快速成长起来? 成长的故事之Spring Core系列 你是如何看待Spring容器的,是这样子吗? Spring的启动过程,你有认真思考过吗?(待写) 面向切面编程,你指的是Sp ...

  3. 第41章 CORS - Identity Server 4 中文文档(v1.0.0)

    第41章 CORS IdentityServer中的许多端点将通过基于JavaScript的客户端的Ajax调用进行访问.鉴于IdentityServer最有可能托管在与这些客户端不同的源上,这意味着 ...

  4. 第3章 支持和规范 - Identity Server 4 中文文档(v1.0.0)

    IdentityServer实现以下规范: 3.1 OpenID Connect OpenID Connect Core 1.0 (规范) OpenID Connect Discovery 1.0 ( ...

  5. c#连接oracle数据库底层方法

    using Oracle.ManagedDataAccess.Client;using System;using System.Collections;using System.Collections ...

  6. ASP.NET MVC Session 过期验证跳转至登入页面

    一.在要检查登入的控制器上继承 CheckLoginController 类 2. CheckLoginController 类的写法 using System; using System.Colle ...

  7. Go开发之路(目录)

    知识点 1. Go语言 简介 2. Go语言 基本语法 3. Go语言 strings以及strconv的使用 4. Go语言 时间和日期类型 5. Go语言 指针类型 6. Go语言 流程控制 7. ...

  8. 【代码笔记】Web-CSS-CSS Fonts(字体)

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-widgets简介

    [官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-widgets/index.html] 一.Intro ...

  10. FT 软件项目管理

    FT 软件项目: 以Feature Team形式组织起来的软件研发项目. 项目是临时组织不是长期组织.  人员临时组织起来, 无组织汇报关系.大家需要充分理解和认同项目的目标,通过项目获得技术.经验. ...