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

控件模板:如果控件的样式不能满足,可自定义控件模板来设计样式。
数据模板:内容控件通过ContentTemplate属性支持数据模板;列表控件(即继承自ItemsControl类的控件),通过ItemTemplate属性支持数据模板,该模板用于显示由ItemSource提供集合中的每一项。
面板模板:ItemsPanelTemplate用于指定项的布局。 ItemsControl 类型具有一个类型为ItemsPanelTemplate 的 ItemsPanel 属性。
一、控件模板:如果控件的样式不能满足,可自定义控件模板来设计样式.

    <Window.Resources><ControlTemplate x:Key="roundBtnTemplte"><Grid><Ellipse Name="roundBtn" Width="100" Height="100" Fill="AliceBlue"></Ellipse><ContentPresenter Content="{TemplateBinding Button.Content}" VerticalAlignment="Center"></ContentPresenter></Grid><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="true"><Setter TargetName="roundBtn" Property="Fill" Value="Yellow"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></Window.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="1*"></ColumnDefinition><ColumnDefinition Width="1*"></ColumnDefinition></Grid.ColumnDefinitions><StackPanel Margin="10" Grid.Column="0" Orientation="Horizontal"><Button Padding="5" Margin="5" Content="Round Button" Template="{StaticResource
roundBtnTemplte}"></Button><Button Padding="5" Margin="5">nomal button</Button></StackPanel></Grid>

2.数据模板:内容控件通过ContentTemplate属性支持数据模板;列表控件(即继承自ItemsControl类的控件),通过ItemTemplate属性支持数据模板,该模板用于显示由ItemSource提供集合中的每一项。

<Window x:Class="WpfApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib"Title="MainWindow" Height="350" Width="525"><Window.Resources><!--创建数据模板--><HierarchicalDataTemplate  x:Key="NavDataTem" ItemsSource="{Binding Children}"><Border Name="myborder" BorderBrush="AliceBlue" BorderThickness="2" Margin="3"><StackPanel Orientation="Horizontal" Margin="0,3"><CheckBox IsChecked="{Binding IsChecked}" Content=""/><Image Source="{Binding Icon}" Width="16" Height="16"></Image><TextBlock Name="txtOne" Margin="5" FontWeight="Bold" Text="{Binding ItemName}" ></TextBlock><TextBlock Name="txtTwo"  Margin="5" Text="{Binding ItemProperty}" ></TextBlock></StackPanel></Border><HierarchicalDataTemplate.Triggers><Trigger SourceName="myborder" Property="IsMouseOver" Value="True"><Setter TargetName="txtOne" Property="Background" Value="LightGray"></Setter><Setter TargetName="txtTwo" Property="FontSize" Value="20"></Setter></Trigger></HierarchicalDataTemplate.Triggers></HierarchicalDataTemplate></Window.Resources><StackPanel Margin="5"><TreeView Name="treeTest" ScrollViewer.VerticalScrollBarVisibility="Visible"  ItemTemplate="{StaticResource NavDataTem}"></TreeView></StackPanel>
</Window>
 public class NavBarItem : INotifyPropertyChanged{public string ID { get { return Guid.NewGuid().ToString(); } }public string ItemName { get; set; }public string ItemProperty { get; set; }public List<NavBarItem> Children { get; set; }public NavBarItem(){Children = new List<NavBarItem>();}public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(PropertyChangedEventArgs e){if (PropertyChanged != null)PropertyChanged(this, e);}}/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{List<NavBarItem> _NavBarItems = new List<NavBarItem>();List<NavBarItem> NavBarItems{get { return _NavBarItems; }set { _NavBarItems = value; }}public MainWindow(){InitializeComponent();treeTest.ItemsSource = NavBarItems;List<NavBarItem> childrenOne = new  List<NavBarItem>();childrenOne.Add(new NavBarItem(){ItemName = "C++",ItemProperty = "C++语言"});childrenOne.Add(new NavBarItem(){ItemName = "C",ItemProperty = "C语言"});childrenOne.Add(new NavBarItem(){ItemName = "C#",ItemProperty = "C#语言"});childrenOne.Add(new NavBarItem(){ItemName = "Java",ItemProperty = "Java语言"});List<NavBarItem> childrenTwo = new List<NavBarItem>();childrenTwo.Add(new NavBarItem(){ItemName = "Windows",ItemProperty = "微软"});childrenTwo.Add(new NavBarItem(){ItemName = "Linux",ItemProperty = "开源"});childrenTwo.Add(new NavBarItem(){ItemName = "MacOS",ItemProperty = "苹果"});NavBarItems.Add(new NavBarItem(){ItemName = "编程语言",Children = childrenOne});NavBarItems.Add(new NavBarItem(){ItemName = "操作系统",Children = childrenTwo});}}


说明:控件模板和数据模板的关系
控件只是数据和行为的载体,至于它本身长什么样子和数据长什么样子都是靠Template决定的。决定控件外观的是ControlTemplate,决定数据外观的是DataTemplate,它们正是Control类的Template和ContentTemplate两个属性的值。
  一般来说,ControlTemplate内都有一个ContentPresenter,这个ContentPresenter的ContentTemplate就是DataTemplate类型。所以数据模板和控件模板的关系如下图所示:

Control类型
- Template属性 (ControlTemplate类型)
- ContentPresenter
- ContentTemplate (DataTemplate类型)

ContentControl类型
- Template属性 (ControlTemplate类型) 继承自Control
- ContentTemplate (DataTemplate类型)

ItemsControl类型
- Template属性 (ControlTemplate类型) 继承自Control
- ItemsPanel属性 (ItemsPanelTemplate类型) 指定布局容器
- ItemTemplate属性 (DateTemplate类型) 每个Item的Template

3.面板模板

增加ItemsPanelTemplate调整面板布局

    <Window.Resources><!--创建数据模板--><HierarchicalDataTemplate  x:Key="NavDataTem" ItemsSource="{Binding Children}"><Border Name="myborder" BorderBrush="AliceBlue" BorderThickness="2" Margin="3"><StackPanel Orientation="Horizontal" Margin="0,3"><CheckBox IsChecked="{Binding IsChecked}" Content=""/><Image Source="{Binding Icon}" Width="16" Height="16"></Image><TextBlock Name="txtOne" Margin="5" FontWeight="Bold" Text="{Binding ItemName}" ></TextBlock><TextBlock Name="txtTwo"  Margin="5" Text="{Binding ItemProperty}" ></TextBlock></StackPanel></Border><HierarchicalDataTemplate.Triggers><Trigger SourceName="myborder" Property="IsMouseOver" Value="True"><Setter TargetName="txtOne" Property="Background" Value="LightGray"></Setter><Setter TargetName="txtTwo" Property="FontSize" Value="20"></Setter></Trigger></HierarchicalDataTemplate.Triggers></HierarchicalDataTemplate><ItemsPanelTemplate x:Key="ItemsPanelTem"><StackPanel Orientation="Horizontal"VerticalAlignment="Center"HorizontalAlignment="Left"/></ItemsPanelTemplate></Window.Resources><StackPanel Margin="5"><TreeView Name="treeTest" ScrollViewer.VerticalScrollBarVisibility="Visible"  ItemTemplate="{StaticResource NavDataTem}" ItemsPanel="{StaticResource ItemsPanelTem}"></TreeView></StackPanel>
</Window>

转载 WPF 控件模板 数据模板 面板模板相关推荐

  1. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  2. 开源WPF控件库-AdonisUI

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

  3. WPF 控件设计艺术[开篇]

    WPF 控件设计艺术--样式.模板.触发器.数据绑定 WPF 控件设计艺术--样式.模板.触发器.数据绑定:围绕WPF控件设计,从样式.模板.触发器和数据绑定触发,引导初学者快速设计和使用WPF控件设 ...

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

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

  5. WPf控件模板缺省样式

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

  6. WPF控件样式、模板

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

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

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

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

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

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

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

最新文章

  1. 帝国CMS附件大小限制
  2. JQuery源码解析(一)
  3. python 获取json中最大值_详细解析 Python 爬取 bilibili 的视频、弹幕以及封面
  4. 自己都不觉得自己值钱,别人怎么觉得你值钱?
  5. zynq7020安装linux图形界面,ZYNQ开发板的NFS文件系统安装 - ZYNQ7020学习
  6. I00003 贝尔三角形
  7. php 实用 函数,PHP实用函数9
  8. Java 最常见的 200+ 面试题:面试必备 1
  9. IDEA中自动导包设置及自动导包快捷键
  10. 基于飞桨实现BigGAN生成动漫图像——为艺术创作赋能
  11. 只需5分钟-----手把手教你如何注册美国AppleId账号
  12. Android 呼叫转移
  13. 利用学生身份“白嫖”-教育优惠
  14. 《OKR工作法》读书笔记
  15. Android 8.1 应用安装过程总结
  16. sublime运行python只显示时间_sublime3-python 编译运行不显示内容
  17. 程序员不学会做饭,无异于慢性自杀!
  18. Java 读取Word表格中的文本和图片
  19. Linux桌面系统各种字体配置
  20. 在Mac环境下系统本身就带有的Apache(阿帕奇服务器)和PHP都预装好了,且合并完成。如果不知道请查看MAC 下配置Apache和PHP

热门文章

  1. 2008年新作——《网管员面试宝典》上市了
  2. STM32F103移植LiteOS之跑马灯实验
  3. Spring事务与事务传播机制
  4. Java获取获取汉字拼音和首字母代码
  5. 牛客网暑期ACM多校训练营(第四场) C Chiaki Sequence Reloaded
  6. 免费的QQ靓号!!!!!!
  7. 第28节 防火墙基本知识、工作原理及工作模式
  8. 408地域化趋势!湖北省985/211考研接近全考408!
  9. 1981年柏林的德国逻辑思考学院面试题,逆天5*5推理题!
  10. linux远程root拒绝,ubuntu拒绝root用户ssh远程登录解决办法