WPF中样式

WPF中样式:类似于winform中控件的属性

<Grid><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/></Grid>

 效果如下: 

 如果要创建多个相似效果的按钮,就需要将该属性写多次,虽然也能达到相同的效果;但是费力。

<Grid><StackPanel><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/></StackPanel></Grid>

 效果如下: 

因此,首先想到的是早轮子重复使用。需要通过Style。

创建样式的步骤:

  • 在Window.Resources中创建样式
  • 给每个样式声明一个键Key,一个样式的名称而已
  • 给每个样式声明一个目标类型TargetType,例如Button
  • 设置属性:(Button为例)
  • 字体大小FontSize
  • 背景颜色Background
  • 字体颜色Foreground,边距Margin
  • 水平位置HorizontalAlignment,垂直位置VerticalAlignment

样式是组织和重用以上的重要工具。不是使用重复的标记填充XAML,通过Styles创建一系列封装所有这些细节的样式。它也是模板(Template)、触发器(Trigger)的基础。

    <Window.Resources><Style x:Key="defaultStyle" TargetType="Button"><Setter Property="FontSize" Value="30"/><Setter Property="Foreground" Value="Blue"/><Setter Property="Width" Value="100"/><Setter Property="Height" Value="40"/></Style></Window.Resources><Grid><StackPanel><Button Style="{StaticResource defaultStyle}" Content="Hello"/><Button Style="{StaticResource defaultStyle}" Content="Hello"/><Button Style="{StaticResource defaultStyle}" Content="Hello"/></StackPanel></Grid>

 效果如下:

查询Style源代码:

namespace System.Windows
{//// 摘要://     启用的属性、 资源和事件处理程序的一种类型的实例之间共享。[ContentProperty("Setters")][DictionaryKeyProperty("TargetType")][Localizability(LocalizationCategory.Ignore)]public class Style : DispatcherObject, INameScope, IAddChild, ISealable, IHaveResources, IQueryAmbient{//// 摘要://     初始化 System.Windows.Style 类的新实例。public Style();//// 摘要://     新实例初始化 System.Windows.Style 类,用于对指定 System.Type。//// 参数://   targetType://     该样式将应用于哪个类型。public Style(Type targetType);//// 摘要://     新实例初始化 System.Windows.Style 类,用于对指定 System.Type 并根据指定 System.Windows.Style。//// 参数://   targetType://     该样式将应用于哪个类型。////   basedOn://     要基于此样式的样式。public Style(Type targetType, Style basedOn);//// 摘要://     获取一个值,该值指示是否样式是只读的并且不能更改。//// 返回结果://     true 如果样式密封的;,否则为 false。public bool IsSealed { get; }//// 摘要://     获取或设置此样式所针对的类型。//// 返回结果://     此样式目标类型。[Ambient][Localizability(LocalizationCategory.NeverLocalize)]public Type TargetType { get; set; }//// 摘要://     获取或设置是当前样式的基础已定义的样式。//// 返回结果://     已定义的样式,其当前样式的基础。 默认值为 null。[Ambient][DefaultValue(null)]public Style BasedOn { get; set; }//// 摘要://     获取一套 System.Windows.TriggerBase 应用属性值的对象根据指定的条件。//// 返回结果://     System.Windows.TriggerBase 对象的集合。 默认值为空集合。[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]public TriggerCollection Triggers { get; }//// 摘要://     获取一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。//// 返回结果://     一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。 默认值为空集合。[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]public SetterBaseCollection Setters { get; }//// 摘要://     获取或设置此样式的作用域内的可用资源的集合。//// 返回结果://     可以使用此样式的作用域内的资源。[Ambient]public ResourceDictionary Resources { get; set; }//// 摘要://     返回此 System.Windows.Style 的哈希代码。//// 返回结果://     此 System.Windows.Style 的哈希代码。public override int GetHashCode();//// 摘要://     在当前的名称范围中注册新的名称对象对。//// 参数://   name://     要注册的名称。////   scopedElement://     要映射到指定的对象 name。public void RegisterName(string name, object scopedElement);//// 摘要://     锁定此样式和所有工厂和触发器,使它们不能进行更改。public void Seal();//// 摘要://     从名称范围中移除名称对象映射。//// 参数://   name://     要删除的映射的名称。public void UnregisterName(string name);}
}
  • TargetType:Style的作用类型,例如Button。
  • BaseOn:继承已有的样式。
  • TriggerCollection:触发器集合。
  • SetterBaseCollection:属性集合。
  • ResourceDictionary:资源字典,比如笔刷,样式。

样式的作用:样式可以包含多个属性(样式管理属性集合),并批量作用于对象(不用写过多重复代码),也可以用于继承。

    <Window.Resources><Style TargetType="Button"><Setter Property="FontSize" Value="25"/><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="Black"/><Setter Property="Content" Value="Button"/></Style></Window.Resources><Grid><UniformGrid Columns="3" Rows="3"><Button /><Button /><Button /><Button /><Button /><Button /><Button /><Button /><Button /></UniformGrid></Grid>

 效果如下:

给样式起名字,并在作用对象中使用该样式:

    <Window.Resources><Style x:Key="ButtonStyle" TargetType="Button"><Setter Property="FontSize" Value="25"/><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="Black"/><Setter Property="Content" Value="Button"/></Style></Window.Resources><Grid><UniformGrid Columns="3" Rows="3"><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/><Button Style="{StaticResource ButtonStyle}"/></UniformGrid></Grid>

 效果如下: 

样式继承

    <Window.Resources><Style x:Key="baseButtonStyle" TargetType="Button"><Setter Property="FontSize" Value="30"/><Setter Property="Foreground" Value="Blue"/></Style><Style x:Key="defaultButtonStyle1" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}"><Setter Property="Width" Value="100"/><Setter Property="Height" Value="40"/></Style><Style x:Key="defaultButtonStyle2" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}"><Setter Property="Width" Value="100"/><Setter Property="Height" Value="50"/></Style></Window.Resources><Grid><StackPanel><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button Style="{StaticResource defaultButtonStyle1}" Content="Hello"/><Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/><Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/></StackPanel></Grid>

效果如下: 

控件模板ControlTemplate

视图->其他->文档大纲

右键按钮->编辑模板->编辑副本

产生按钮模板:

<Window.Resources><Style x:Key="FocusVisual"><Setter Property="Control.Template"><Setter.Value><ControlTemplate><Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/></ControlTemplate></Setter.Value></Setter></Style><SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/><SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/><SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/><SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/><SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/><SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/><SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/><SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/><SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/><Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"><Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/><Setter Property="Background" Value="{StaticResource Button.Static.Background}"/><Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/><Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/><Setter Property="BorderThickness" Value="1"/><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="VerticalContentAlignment" Value="Center"/><Setter Property="Padding" Value="1"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"><ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Border><ControlTemplate.Triggers><Trigger Property="IsDefaulted" Value="true"><Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/></Trigger><Trigger Property="IsMouseOver" Value="true"><Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/><Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/></Trigger><Trigger Property="IsPressed" Value="true"><Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/><Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/></Trigger><Trigger Property="IsEnabled" Value="false"><Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/><Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/><Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></Window.Resources>

Content Presenter使得按钮可以承载很多内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/260115.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x86使用内敛汇编实现简单的临界段保护

临界资源保护 实现方法 禁用中断 __attribute__((used)) static inline uint32_t read_eflags (void){uint32_t eflags;ASM_V("pushf\n\tpop %%eax":"a"(eflags));return eflags; } __attribute__((used)) static inline void write_eflags (uint32_t e…

安全架构设计理论与实践

一、考点分布 安全架构概述&#xff08;※※&#xff09;安全模型&#xff08;※※※&#xff09;信息安全整体架构设计网络安全体系架构设计区块链技术&#xff08;※※&#xff09; 二、安全架构概述 被动攻击&#xff1a;收集信息为主&#xff0c;破坏保密性 主动攻击&#…

Quantitative Analysis: PIM Chip Demands for LLAMA-7B inference

1 Architecture 如果将LLAMA-7B模型参数量化为4bit&#xff0c;则存储模型参数需要3.3GB。那么&#xff0c;至少PIM chip 的存储至少要4GB。 AiM单个bank为32MB&#xff0c;单个die 512MB&#xff0c;至少需要8个die的芯片。8个die集成在一个芯片上。 提供816bank级别的访存带…

计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密。本文概况性地将Sora模型生成视频主要分为三个步骤&#xff1a;视频压缩网络、空间时间潜在补丁提取以及视频生成的Transformer模型。 文章目录…

「年后复工主题」app用户运营拉新,接入引爆用户增长的活动

随着春节假期的结束&#xff0c;人们重返工作岗位&#xff0c;各行各业也迎来了年后复工的高峰期。在这个时间节点&#xff0c;APP运营团队面临着一个绝佳的机遇——利用节日余温和复工活力&#xff0c;通过策划一系列相关主题的趣味活动来吸引新用户&#xff0c;实现用户增长的…

消息队列(Message Queue)

目录 一、概念 二、消息队列使用场景 三、消息队列的两种模式 1.点对点模式 2.发布/订阅模式 四、常用消息队列介绍 1.RabbitMQ 1) 主要特性 2&#xff09;安装需要 3&#xff09;优点 4&#xff09;缺点 2.ActiveMQ 1&#xff09;主要特性 2) 安装需要 3&#xff09;优…

uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)

方案&#xff1a;使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意&#xff1a;u-parse直接使用是不兼容小程序的&#xff0c;需要对u-parse进行改造&#xff1a; 1. 查看u-parse源码发现小程序走到以…

Panalog大数据日志审计系统libres_syn_delete.php存在命令执行漏洞

文章目录 前言声明一、Panalog大数据日志审计系统简介二、漏洞描述三、影响版本四、漏洞复现五、整改意见 前言 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流量的信息进行日志留存&#xff0c…

K8s进阶之路-命名空间级-服务发现 :

服务发现&#xff1a; Service&#xff08;东西流量&#xff09;&#xff1a;集群内网络通信、负载均衡&#xff08;四层负载&#xff09;内部跨节点&#xff0c;节点与节点之间的通信&#xff0c;以及pod与pod之间的通信&#xff0c;用Service暴露端口即可实现 Ingress&#…

MySQL命令行输入密码后闪退解决方案

使用MySQL8.0的Command&#xff0c;输入密码后闪退&#xff0c;但是如果不输入密码直接回车&#xff0c;却能直接进入MySQL环境&#xff1b;另外&#xff0c;在IDEA中也无法通过密码连接到root。在网上有如下常见的解决方案&#xff1a;(1)移动my.ini、(2)启动MySQL服务等。但是…

【lesson62】网络通信UdpSocket版

文章目录 UdpSocketUdpServer.hppUdpServer类成员变量解释成员函数解释 UdpServer的实现ServerIinit的实现socketbindhtonsinet_addr具体实现 ServerStart的实现recvfromsendtontohsinet_ntoa具体实现 ~UdpServer函数实现UdpServer.hpp整体完整代码 UdpServer.ccUdpClient.ccTh…

网络防火墙综合实验

备注&#xff1a;电信网段15.1.1.0 移动网段14.1.1.0 办公区 11.1.1.0 生产区 10.1.1.0 服务区 13.1.1.0 公网 1.1.1.1 和 2.2.2.2 需求&#xff1a; 1、办公区设备可以通过电信链路和移动链路上网&#xff08;多对多nat&#xff0c;并且需要保留一个公网ip&#xff09; 2、…

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…

使用阿里云发送短信

使用阿里云短信服务有两种方式 API 发送和 控制台发送&#xff0c;控制台发送到话有太多限制&#xff0c;这里我们使用API 通过 调用服务端代码进行发送。 整体结构如下&#xff1a; 导入依赖 <!--阿里云短信发送--><dependency><groupId>com.aliyun<…

1、电源管理入门之关机重启详解

目录 1. 关机重启软件流程框图 1.1 用户层 1.2 Linux内核层 1.3 ATF层 1.4 SCP层 2. Busybox中的关机重启命令 3. Linux内核中的处理 3.1 系统调用实现 3.2 内核关机函数分析 3.3 关闭所有设备处理 3.4 多CPU调度相关处理 3.5 内核核心关闭 3.6 硬件平台的关闭 3…

用户空间与内核通信(一)

在Linux中&#xff0c;内核空间与用户空间是操作系统中的两个主要部分&#xff0c;它们有着明显的区别和不同的功能。 内核空间&#xff1a; 内核空间是操作系统内核运行的区域&#xff0c;它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间位于虚拟地址空间的最…

GptSoVits音频教程

这个号称5秒克隆&#xff0c;或者用1分钟音频训练10分钟就能达到原声效果。 5秒的号称&#xff0c;只要是&#xff0c;什么几秒的&#xff0c;大家可以完全不要想了&#xff0c;什么知更鸟&#xff0c;什么火山&#xff0c;包括本次的GptSoVits的效果肯定是不行的&#xff0c;…

gRPC 备查

简介 HTTP/2 HTTP/2 的三个概念 架构 使用流程 gRPC 的接口类型 1.单一RPC 2.服务器流式RPC 3.客户端式流式RPC 4.双向流式RPC

WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?

YIA主题设置中默认有4个广告位&#xff0c;而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白&#xff0c;导致下方的两个角没有变圆角&#xff0c;看起来也有点不好看。具体如下图所示&#xff1a; 其实&#xff0c;这个问题就是典型…

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…