转载 WPF 控件模板 数据模板 面板模板
转载自: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 控件模板 数据模板 面板模板相关推荐
- [转载]WPF控件拖动
这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...
- 开源WPF控件库-AdonisUI
原文:https://github.com/benruehl/adonis-ui 翻译:沙漠尽头的狼(谷歌翻译加持) 用于 WPF 应用程序的轻量级 UI 工具包,提供经典和增强的 Windows 视 ...
- WPF 控件设计艺术[开篇]
WPF 控件设计艺术--样式.模板.触发器.数据绑定 WPF 控件设计艺术--样式.模板.触发器.数据绑定:围绕WPF控件设计,从样式.模板.触发器和数据绑定触发,引导初学者快速设计和使用WPF控件设 ...
- [转] 使用模板自定义 WPF 控件
[转] 使用模板自定义 WPF 控件 ...
- WPf控件模板缺省样式
WPF控件模板缺省样式:http://www.cnblogs.com/khler/archive/2009/07/14/1523043.html 转载于:https://www.cnblogs.com ...
- WPF控件样式、模板
初次写博客,新手请多指教. 写WPF已有一年有余了,平时在工作项目当中喜欢总结一些公用库,通用样式之类的,以便于日后工作中遇到,可以直接复用,提供工作效率. 本文提供 Windows.Button.S ...
- DevExpress v15.1:WPF控件升级(四)
2019独角兽企业重金招聘Python工程师标准>>> <下载最新版DevExpress WPF Controls v15.1.5> WPF编辑器 在Token编辑器中的 ...
- WPF控件开发之自定义控件(3)
创建 UserControl 如前所述,在 WPF 中创建控件的最简单方法是从 UserControl 派生.下面的示例演示用于定义 NumericUpDownUserControl 的 用户界面 ( ...
- wpf控件开发基础(1)
从现在开始,我将尝试写有关wpf控件开发相关的知识,把文章这对我来说很难,所以这个系列的文章在时间跨度上可能会拖的比较长.我希望我介绍是比较详细的,而不仅仅是一个简单的控件开发流程.我是一个真正的We ...
最新文章
- 帝国CMS附件大小限制
- JQuery源码解析(一)
- python 获取json中最大值_详细解析 Python 爬取 bilibili 的视频、弹幕以及封面
- 自己都不觉得自己值钱,别人怎么觉得你值钱?
- zynq7020安装linux图形界面,ZYNQ开发板的NFS文件系统安装 - ZYNQ7020学习
- I00003 贝尔三角形
- php 实用 函数,PHP实用函数9
- Java 最常见的 200+ 面试题:面试必备 1
- IDEA中自动导包设置及自动导包快捷键
- 基于飞桨实现BigGAN生成动漫图像——为艺术创作赋能
- 只需5分钟-----手把手教你如何注册美国AppleId账号
- Android 呼叫转移
- 利用学生身份“白嫖”-教育优惠
- 《OKR工作法》读书笔记
- Android 8.1 应用安装过程总结
- sublime运行python只显示时间_sublime3-python 编译运行不显示内容
- 程序员不学会做饭,无异于慢性自杀!
- Java 读取Word表格中的文本和图片
- Linux桌面系统各种字体配置
- 在Mac环境下系统本身就带有的Apache(阿帕奇服务器)和PHP都预装好了,且合并完成。如果不知道请查看MAC 下配置Apache和PHP