是的,最近在看WPF,也算是加深下c#的知识,毕竟winform的界面有的时候真的不是很美观。WPF中模板与Style不同,Style只能改变控件的已有属性值(比如颜色字体)来定制控件,形同HTML中的CSS,但控件模板可以改变控件的内部结构(VisualTree,视觉树)来完成更为复杂的定制,其实WPF的每一个控件都有一个默认的模板。

数据模板跟控件模板的区别主要体现在,通常情况下,控件模板只是为了自己而呈现的,并不反映基础数据。 例如,一个Button不会被绑定到一个业务对象 - 它只是可以被点击。 而ContentControl或ListBox通常显示为可以为用户呈现数据。因此,DataTemplate用于为底层数据提供可视结构,而ControlTemplate与底层数据无关,仅为控件本身提供可视化布局。

ControlTemplate通常只包含TemplateBinding表达式,绑定回控件本身的属性,而DataTemplate将包含标准绑定表达式,并绑定到其DataContext(业务/域对象或视图模型)的属性,它们面对的绑定对象类型不一致。

对此,查看下面简单的数据模板和控件模板示例,体验区别:

<Windowxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfBook"xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="WpfBook.ImageButton"Title="ImageButton" Height="300" Width="300" Activated="Window_Activated"><Window.Resources><ControlTemplate x:Key="ImageButton-ControlTemplate" TargetType="{x:Type Button}"><Grid><Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"  Fill="{TemplateBinding Background}"/><TextBlock Margin="{TemplateBinding Padding}" VerticalAlignment="Center"  HorizontalAlignment="Center"  Text="{TemplateBinding Content}" /></Grid><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="true"><Setter Property="Foreground" Value="Red" /></Trigger></ControlTemplate.Triggers></ControlTemplate><DataTemplate x:Key="ImageButton-DataTemplate" DataType="{x:Type local:Person}"><TextBlock x:Name="tb" Text="{Binding Name}" Margin="1" /><DataTemplate.Triggers><DataTrigger Binding="{Binding IsOnline}" Value="False"><Setter TargetName="tb" Property="Foreground" Value="Gray" /></DataTrigger></DataTemplate.Triggers></DataTemplate><DataTemplate x:Key="Item-DataTemplate" DataType="{x:Type local:Person}"><TextBlock x:Name="tb" Text="{Binding Name}" Margin="1" /><DataTemplate.Triggers><DataTrigger Binding="{Binding IsOnline}" Value="False"><Setter TargetName="tb" Property="Foreground" Value="Red" /></DataTrigger></DataTemplate.Triggers></DataTemplate></Window.Resources><StackPanel Orientation="Vertical"><Button Template="{StaticResource ImageButton-ControlTemplate}" Content="abcde"/><Button x:Name="ddd" ContentTemplate="{StaticResource ImageButton-DataTemplate}" Content="{Binding APerson}"/><ListBox x:Name="list1" ItemTemplate="{StaticResource Item-DataTemplate}" ItemsSource="{Binding Persons}"/></StackPanel>
</Window>

这里补充点:

参考数据绑定思维,数据模板通过Content属性指定数据源,将数据先绑定到Content属性上,通过ContentTemplate指定数据处理方式。Button是数据content 对应的模板是ContentTemplate,Button是control对应的模板是Template。
数据模板中设定属性,必须要使用指定TargetName,而控件模板不需要。
数据模板中除了给ContentTemplate,例子中还可以设定给ItemsControl的ItemTemplate属性。除此以外还可以设定给GridViewColumn的CellTemplate属性。数据模板在页面xaml内部定义,而控件模板通常放到样式文件中。

参考https://blog.csdn.net/jfyy/article/details/80743009

WPF控件模板和数据模板的区别相关推荐

  1. 转载 WPF 控件模板 数据模板 面板模板

    转载自:https://blog.csdn.net/ceasadan/article/details/61414879 模板使用方式:首先定义模板,然后在把对应的key应用到控件对应的属性中: 属性对 ...

  2. [转] 使用模板自定义 WPF 控件

      [转] 使用模板自定义 WPF 控件                                                                                 ...

  3. WPf控件模板缺省样式

    WPF控件模板缺省样式:http://www.cnblogs.com/khler/archive/2009/07/14/1523043.html 转载于:https://www.cnblogs.com ...

  4. WPF控件样式、模板

    初次写博客,新手请多指教. 写WPF已有一年有余了,平时在工作项目当中喜欢总结一些公用库,通用样式之类的,以便于日后工作中遇到,可以直接复用,提供工作效率. 本文提供 Windows.Button.S ...

  5. 在Repeater控件,Repeater1控件中都有FooterTemplate模板.但你在后台中如何去找FooterTemplate中的控件呢?...

    在Repeater控件,Repeater1控件中都有FooterTemplate模板.但你在后台中如何去找FooterTemplate中的控件呢? 如.<FooterTemplate>   ...

  6. 开源WPF控件库-AdonisUI

    原文:https://github.com/benruehl/adonis-ui 翻译:沙漠尽头的狼(谷歌翻译加持) 用于 WPF 应用程序的轻量级 UI 工具包,提供经典和增强的 Windows 视 ...

  7. WPF控件开发之自定义控件(3)

    创建 UserControl 如前所述,在 WPF 中创建控件的最简单方法是从 UserControl 派生.下面的示例演示用于定义 NumericUpDownUserControl 的 用户界面 ( ...

  8. WPF控件开发之自定义控件(1)

    Windows Presentation Foundation (WPF) 控件模型的扩展性极大减少了创建新控件的需要.但在某些情况下,仍可能需要创建自定义控件.本主题讨论可最大限度减少在 Windo ...

  9. DevExpress v15.1:WPF控件升级(四)

    2019独角兽企业重金招聘Python工程师标准>>> <下载最新版DevExpress WPF Controls v15.1.5> WPF编辑器 在Token编辑器中的 ...

  10. wpf控件开发基础(1)

    从现在开始,我将尝试写有关wpf控件开发相关的知识,把文章这对我来说很难,所以这个系列的文章在时间跨度上可能会拖的比较长.我希望我介绍是比较详细的,而不仅仅是一个简单的控件开发流程.我是一个真正的We ...

最新文章

  1. c++连接oracle数据库程序,无法从c++程序连接到我的oracle数据库
  2. Nginx if 条件判断
  3. python sklearn svm 权重_sklearn svm基本使用
  4. java 局部变量垃圾回收_java局部变量对垃圾回收的影响
  5. access注入大全
  6. php相差天数,php获取给定日期相差天数
  7. POJ 2115C Looooops[一元线性同余方程]
  8. 学会这两个技巧!让你的Mac文件共享超简单
  9. Linux Shell编程(25)——I/O 重定向
  10. IOS开发-jqeurey mobile
  11. 金山词霸2006专业版(300M)的无法屏幕取词问题的解决方法!
  12. Unity Koreographer 之 音乐制作插件介绍学习,一般使用步骤介绍(包括:一般音乐游戏制作流程简绍) 一
  13. oracle报错ora-01033解决办法
  14. 截止失真放大电路_基本共射放大电路的特点你懂了吗?
  15. 【Python】基于Python计算长时间遥感栅格图像的像元值变化度(斜率)和变异系数
  16. 固态硬盘是什么接口_笔记本固态硬盘的接口有哪些?来学习下笔记本SSD小知识...
  17. 朴素贝叶斯情感分析评分python_朴素贝叶斯算法下的情感分析——C#编程实现
  18. stm8 ADC中断采集
  19. Vue学习笔记三(组件间通信)
  20. Process ‘command ‘C:/Program Files/Java/jdk1.8.0_192/bin/java.exe‘‘ finished with non-zero exit valu

热门文章

  1. H3C无线网络延时大、数据丢包,不能上网,原来是有BUG
  2. 塑形管理小程序开发(二)-原型图绘制
  3. vue中遇到使用iframe出现的页面崩溃问题
  4. 更改Linux终端用户名显示颜色的PS1的用法
  5. centos7安装mysql5.7步骤(图解版)
  6. 常见网站挂马方式 网站挂马可利用漏洞 网站加密挂马
  7. 小米手机切换应用--完美实现步骤
  8. 微信防封域名处理 淘客类 检测域名是否被封
  9. 假设检验之单个总体均值检验(含Python代码)
  10. 蓝桥杯算法训练——调和数列问题