WPF ControlTemplate

2023-12-20 00:32
文章标签 wpf controltemplate

本文主要是介绍WPF ControlTemplate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ControlTemplate:外观定制
<Window.Resources><ControlTemplate x:Key="CheckBoxControlTemplate" TargetType="CheckBox"><StackPanel><Rectangle Name="breakRectangle" Stroke="Red" StrokeThickness="2" Width="20" Height="20"><Rectangle.Fill><!--默认Rectangle填充色为White--><SolidColorBrush Color="White"></SolidColorBrush></Rectangle.Fill></Rectangle><!--ContentPresenter 保留原控件属性--><ContentPresenter Margin="{TemplateBinding Padding}"></ContentPresenter></StackPanel></ControlTemplate>
</Window.Resources>
<Grid><Grid.RowDefinitions><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition></Grid.RowDefinitions><CheckBox Content="我是普通CheckBox"></CheckBox><CheckBox Grid.Row="1" Template="{StaticResource CheckBoxControlTemplate}" Content="我是模板CheckBox"></CheckBox><CheckBox Grid.Row="2" Template="{StaticResource CheckBoxControlTemplate}" Content="我是模板CheckBox,我跟上一个模板的区别在于Padding" Padding="15"></CheckBox>
</Grid>
Tips
<ContentPresenter Margin="{TemplateBinding Padding}"/>

ContentPresenter 保留原控件属性
TemplateBinding Padding,即绑定每个CheckBox自己的Margin,更灵活

效果

在这里插入图片描述

此时,点击Rectangle是没有效果的

ControlTemplate中使用触发器
<ControlTemplate.Triggers><Trigger Property="IsChecked" Value="True"><Setter TargetName="breakRectangle" Property="Fill" Value="Coral"></Setter></Trigger>
</ControlTemplate.Triggers>

Setter可以选择TargetName,即一个控件的触发器可以修改另一个控件的属性

效果
在这里插入图片描述

使用Brush

Brush一类画笔,需定义为对象才能使用
可以使用颜色、图片等等

<Window.Resources><ControlTemplate x:Key="CheckBoxControlTemplate" TargetType="CheckBox"><ControlTemplate.Resources><!--颜色--><SolidColorBrush x:Key="ColorBrush" Color="Pink"></SolidColorBrush><!--图片--><ImageBrush x:Key="ImageBrush" ImageSource="Images/cat.jpg"></ImageBrush></ControlTemplate.Resources><StackPanel><Rectangle Name="breakRectangle" Stroke="OrangeRed" StrokeThickness="2" Width="100" Height="100"><Rectangle.Fill><!--默认Rectangle填充色为White--><SolidColorBrush Color="White"></SolidColorBrush></Rectangle.Fill></Rectangle><!--ContentPresenter 保留原控件属性--><ContentPresenter Margin="{TemplateBinding Padding}"></ContentPresenter></StackPanel><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="True"><Setter TargetName="breakRectangle" Property="Fill" Value="{StaticResource ImageBrush}"></Setter></Trigger><Trigger Property="IsChecked" Value="False"><Setter TargetName="breakRectangle" Property="Fill" Value="{StaticResource ColorBrush}"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate>
</Window.Resources>
<Grid><Grid.RowDefinitions><RowDefinition Height="0.5*"></RowDefinition><RowDefinition Height="0.5*"></RowDefinition><RowDefinition Height="*"></RowDefinition></Grid.RowDefinitions><Label Grid.Row="0" Content="没有选中时,CheckBox填充色为Pink"></Label><Label Grid.Row="1" Content="选中时,CheckBox填充为猫猫的图片"></Label><CheckBox Grid.Row="2" Template="{StaticResource CheckBoxControlTemplate}" Content="我是模板CheckBox"></CheckBox>
</Grid>

效果
在这里插入图片描述
在这里插入图片描述

可以对比在Style中嵌套Template的写法

StyleUseTemplate

其他例子
<Window.Resources><ControlTemplate x:Key="CheckBoxControlTemplate" TargetType="{x:Type CheckBox}"><Grid><TextBlock x:Name="textBlock1" HorizontalAlignment="Left" Margin="116,39,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/><ContentPresenter/></Grid><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="True"><Setter TargetName="textBlock1" Property="Text" Value="CheckBox is checked."></Setter></Trigger><Trigger Property="IsChecked" Value="False"><Setter TargetName="textBlock1" Property="Text" Value="CheckBox is not checked."></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate>
</Window.Resources>
<Grid><CheckBox Template="{StaticResource CheckBoxControlTemplate}" x:Name="checkBox1" Content="CheckBox" HorizontalAlignment="Left" Margin="137,59,0,0" VerticalAlignment="Top"></CheckBox>
</Grid>

对非内置属性的修改,用模板
用style识别不了textBlock1
直接写CheckBox 的Triggers识别不了IsChecked

示例代码

ControlTemplate

这篇关于WPF ControlTemplate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514256

相关文章

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

WPF入门到跪下 第十三章 3D绘图 - 3D绘图基础

3D绘图基础 四大要点 WPF中的3D绘图涉及4个要点: 视口,用来驻留3D内容3D对象照亮部分或整个3D场景的光源摄像机,提供在3D场景中进行观察的视点 一、视口 要展示3D内容,首先需要一个容器来装载3D内容。在WPF中,这个容器就是Viewport3D(3D视口),它继承自FrameworkElement,因此可以像其他元素那样在XAML中使用。 Viewport3D与其他元素相

C# WPF燃气报警器记录读取串口工具

C# WPF燃气报警器记录读取串口工具 概要串口帧数据布局文件代码文件运行效果源码下载 概要 符合国标文件《GB+15322.2-2019.pdf》串口通信协议定义;可读取燃气报警器家用版设备历史记录信息等信息; 串口帧数据 串口通信如何确定一帧数据接收完成是个麻烦事,本文采用最后一次数据接收完成后再过多少毫秒认为一帧数据接收完成,开始解析出来。每次接收到数据更新一次re

WPF-快速构建统计表、图表并认识相关框架

一、使用ScottPlot.Wpf 官网地址:https://scottplot.net/quickstart/wpf/ 1、添加NuGet包:ScottPlot.Wpf 2、XAML映射命名空间:  xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF" 3、简单示例: <ScottPlot:WpfP

C# wpf 实现游戏启动器界面制作的坑

用C# winform制作界面的时候发现背景图是带透明通道的会实现不了,于是用了个单独的类来实现底层背景图带透明 窗口原图: 。。。可是后面发现在鼠标悬浮Windows任务栏中此窗口预览图的时候只会渲染出控件了,没有了背景图。。。 网上找了很久没有找到好的解决办法,于是弃用了winform改用了wpf做游戏启动器的界面。  wpf的界面布局文件类似xml文档,实现背景透明的话不复杂

WPF 点在控件内 判断

文章来源于本人的cnblog克隆https://www.cnblogs.com/ZoeWong/p/18396165 Winform方法 Winform里点在控件内判断方法很简单,获取的Rectangle,然后用它Contains方法就行 WPF方法 WPF不行,但其实也差不多,方法如下: 前提:控件A是总体容器控件,控件B是其子控件,判断鼠标点是否在B内获取鼠标当前位置 Point

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,仅供学习分享使用,如有不足之处,还请指正。 Shape类位于System.Windows.Shapes命名空间,而上篇文章介绍的Brush位于System.W

WPF RadioButton 使用MVVM方式绑定bool的值,总是丢失怎么办

在WPF中使用MVVM模式绑定RadioButton时,如果绑定一个bool类型的值,可能会遇到值丢失的问题。这通常是因为RadioButton的IsChecked属性与bool类型绑定存在直接转换的困难,尤其是在绑定到多个RadioButton时,RadioButton之间的关系也会导致值更新不一致。 为了在MVVM中正确地使用RadioButton绑定一个bool类型的值,我们可以使用Con

WPF中datagrid分页

namespace WpfApplication1{/// <summary>/// 枚举类型/// </summary>public enum sex{男,女};public class company{public string companyname;public string name;public string sex;public int age;public string job;

基于.NET6的WPF基础总结(上)

目录 一.常用属性介绍 二、 程序退出方式 三、布局样式 3.1 Panel的附加属性ZIndex 3.2 Grid(网格)布局 3.3 UniformGrid(均分布局) 3.4 StackPanel(堆积面板) 3.5 WrapPanel(换行面板)  3.6  DockPanel(停靠面板) 3.7 Canvas(画布布局)  3.8 个性化Border 3.9  G