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.hqwc.cn/news/478513.html

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

相关文章

QT编写工具基本流程(自用)

以后有人让你写工具的时候&#xff0c;可以方便用这个模版及时提高工作效率&#xff0c;可以争取早点下班。包含库目录&#xff0c;头文件目录&#xff0c;输出目录以及翻译和部署&#xff0c;基本上都全了&#xff0c;也可以做收藏用用。 文章目录 1、创建项目Dialog Widget都…

NLP_BERT与GPT争锋

文章目录 介绍小结 介绍 在开始训练GPT之前&#xff0c;我们先比较一下BERT和 GPT 这两种基于 Transformer 的预训练模型结构&#xff0c;找出它们的异同。 Transformer架构被提出后不久&#xff0c;一大批基于这个架构的预训练模型就如雨后春笋般地出现了。其中最重要、影响…

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…

【Java EE初阶二十】关于http(一)

1. 初识http HTTP 最新的版本应该是 HTTP/3.0&#xff0c;目前大规模使用的版本 HTTP/1.1&#xff1b; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同&#xff0c;HTTP 的报文格式&a…

CPU设计之分支预测

1、引言 在之前的学习过程中&#xff0c;我们一直在假设程序是顺序执行的。PC每一次都默认4&#xff0c;一直这样周而复始。然而CPU就和人生一样&#xff0c;不可能一直一帆风顺的向前走。在某些场合我们总是需要做出决策&#xff0c;这些决策点&#xff0c;就像高速公路的一个…

LeetCode JS专栏刷题笔记(一)

一、前言 LeetCode 在前不久出了一个 JavaScript 专栏&#xff0c;这个专栏一个目的是为了非前端工程师学习 JS&#xff0c;另一个是为了前端工程师提升 JS 能力。 因此在这个专栏中&#xff0c;基本不涉及什么具体算法问题&#xff0c;都是一些 JS 的入门语法与常见的 JS 面…

Jmeter教程-JMeter 环境安装及配置

Jmeter教程 JMeter 环境安装及配置 在使用 JMeter 之前&#xff0c;需要配置相应的环境&#xff0c;包括安装 JDK 和获取 JMeter ZIP 包。 安装JDK 1.JDK下载 示例环境为Windows11环境&#xff0c;读者应根据实际环境下载JDK的安装包。 JDK下载地址&#xff1a; Java21 下载 …

指针的进阶(C语言)(上)

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针的定义 3.2 数组名VS&数组名 3.3数组指针的运用 前言 对于指针&#xff0c;我们已经有了初步认识&#xff08;可以看我写的指针详解那一篇文章&#xff09;。 简单总结一下基本概念&#xff1a; 1、指针就…

LeetCode 热题 100 | 二叉树(中下)

目录 1 基础知识 1.1 队列 queue 1.2 栈 stack 1.3 常用数据结构 1.4 排序 2 98. 验证二叉搜索树 3 230. 二叉搜索树中第 K 小的元素 4 199. 二叉树的右视图 菜鸟做题忘了第几周&#xff0c;躺平过了个年TT 1 基础知识 1.1 队列 queue queue<type> q…

【基础】电容降压电路的特点及元器件选择

电容降压电路的特点及元器件选择 在电子制作时&#xff0c;为了减小体积、降低成本&#xff0c;往往采用电容降压的方法代替笨重的电源变压器。采用电容降压方法如元器件选择不当&#xff0c;不但达不到降压要求&#xff0c;还有可能造成电路损坏。本文从实际应用角度&#xf…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

Linux常用操作指令

Linux常用操作指令 ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头…