【WPF.NET开发】创建样式

本文内容

  1. 创建样式
  2. 隐式应用样式
  3. 显式应用样式
  4. 以编程方式应用样式
  5. 扩展样式
  6. TargetType 属性与 x:Key 属性之间的关系

使用 Windows Presentation Foundation (WPF),可以使用自己的可重用样式自定义现有控件的外观。 可以对应用、窗口和页面全局应用样式,也可以将样式直接应用于控件。

1、创建样式

可以将 Style 视为一种将一组属性值应用到一个或多个元素的便利方法。 可以对从 FrameworkElement 或 FrameworkContentElement(如 Window 或 Button)派生的任何元素使用样式。

声明样式的最常见方法是在 XAML 文件的 Resources 部分中声明为资源。 由于样式是一种资源,因此它们同样遵从适用于所有资源的范围规则。 简而言之,声明样式的位置会影响样式的应用范围。 例如,如果在应用定义 XAML 文件的根元素中声明样式,则该样式可以在应用中的任何位置使用。

<Application x:Class="IntroToStylingAndTemplating.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:IntroToStylingAndTemplating"StartupUri="WindowExplicitStyle.xaml"><Application.Resources><ResourceDictionary><Style x:Key="Header1" TargetType="TextBlock"><Setter Property="FontSize" Value="15" /><Setter Property="FontWeight" Value="ExtraBold" /></Style></ResourceDictionary></Application.Resources>
</Application>

如果在应用的一个 XAML 文件中声明样式,则该样式只能在该 XAML 文件中使用。 

<Window x:Class="IntroToStylingAndTemplating.WindowSingleResource"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:IntroToStylingAndTemplating"mc:Ignorable="d"Title="WindowSingleResource" Height="450" Width="800"><Window.Resources><Style x:Key="Header1" TargetType="TextBlock"><Setter Property="FontSize" Value="15" /><Setter Property="FontWeight" Value="ExtraBold" /></Style></Window.Resources><Grid />
</Window>

样式由 <Setter> 子元素组成,这些元素在应用了样式的元素上设置属性。 在上面的示例中,请注意,样式已设置为通过 TargetType 属性应用于 TextBlock 类型。 样式会将 FontSize 设置为 15,并将 FontWeight 设置为 ExtraBold。 为样式更改的每个属性添加一个 <Setter>

2、隐式应用样式

Style 是一种将一组属性值应用到多个元素的便利方法。 例如,请考虑以下 TextBlock 元素及其在窗口中的默认外观。

<StackPanel><TextBlock>My Pictures</TextBlock><TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

stylingintro-textblocksbefore.png?view=netdesktop-8.0

可以通过直接对每个 TextBlock 元素设置属性(如 FontSize 和 FontFamily)来更改默认外观。 但是,如果需要让 TextBlock 元素共享某些属性,可以在 XAML 文件的 Resources 部分中创建 Style,如下所示。

<Window.Resources><!--A Style that affects all TextBlocks--><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center" /><Setter Property="FontFamily" Value="Comic Sans MS"/><Setter Property="FontSize" Value="14"/></Style>
</Window.Resources>

将样式的 TargetType 设置为 TextBlock 类型并省略 x:Key 属性时,该样式将应用到样式的所有 TextBlock 元素,通常是 XAML 文件本身。

现在 TextBlock 元素如下所示。

stylingintro-textblocksbasestyle.png?view=netdesktop-8.0

3、显式应用样式

如果向样式添加具有值的 x:Key 属性,则样式将不再隐式应用于 TargetType 的所有元素。 只有显式引用样式的元素才会应用样式。

下面是上一节中的样式,但使用 x:Key 属性进行了声明。

<Window.Resources><Style x:Key="TitleText" TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center" /><Setter Property="FontFamily" Value="Comic Sans MS"/><Setter Property="FontSize" Value="14"/></Style>
</Window.Resources>

若要应用样式,请使用 StaticResource 标记扩展将元素上的 Style 属性设置为 x:Key 值,如下所示。

<StackPanel><TextBlock Style="{StaticResource TitleText}">My Pictures</TextBlock><TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

请注意,第一个 TextBlock 元素已应用样式,而第二个 TextBlock 元素保持不变。 上一节中的隐式样式已更改为声明了 x:Key 属性的样式,也就是说,该样式影响的唯一元素是直接引用该样式的那个元素。

create-a-style-explicit-textblock.png?view=netdesktop-8.0

在显式或隐式应用样式后,它将变为密封状态,不能更改。 如果要更改已应用的样式,请创建新的样式来替换现有样式。 可以创建一个根据自定义逻辑选择要应用的样式的对象。 

4、以编程方式应用样式

若要以编程方式将已命名的样式分配到元素,请从资源集合中获取样式,并将其分配到元素的 Style 属性。 资源集合中的项属于 Object 类型。 因此,在将检索到的样式分配给 Style 属性之前,必须将它强制转换为 System.Windows.Style。 例如,下面的代码将名为 textblock1 的 TextBlock 的样式设置为定义的样式 TitleText

textblock1.Style = (Style)Resources["TitleText"];

5、扩展样式

也许你希望两个 TextBlock 元素共享某些属性值,如 FontFamily 和居中的 HorizontalAlignment。 你可能还希望文本“My Pictures” 具有一些其他属性。 可以通过创建基于第一个样式的新样式来实现此目的,如下所示。

<Window.Resources><!-- .... other resources .... --><!--A Style that affects all TextBlocks--><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center" /><Setter Property="FontFamily" Value="Comic Sans MS"/><Setter Property="FontSize" Value="14"/></Style><!--A Style that extends the previous TextBlock Style with an x:Key of TitleText--><Style BasedOn="{StaticResource {x:Type TextBlock}}"TargetType="TextBlock"x:Key="TitleText"><Setter Property="FontSize" Value="26"/><Setter Property="Foreground"><Setter.Value><LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"><LinearGradientBrush.GradientStops><GradientStop Offset="0.0" Color="#90DDDD" /><GradientStop Offset="1.0" Color="#5BFFFF" /></LinearGradientBrush.GradientStops></LinearGradientBrush></Setter.Value></Setter></Style>
</Window.Resources>
<StackPanel><TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock><TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

此 TextBlock 样式现在居中,使用大小为 26 的 Comic Sans MS 字体,并将前景色设置为如示例中显示的 LinearGradientBrush。 请注意,它会重写基本样式的 FontSize 值。 如果有多个 Setter 指向 Style 中的同一属性,则最后声明的 Setter 优先。

TextBlock 元素现在如下所示:

stylingintro-textblocks.png?view=netdesktop-8.0

此 TitleText 样式扩展为 TextBlock 类型创建的样式,该样式由 BasedOn="{StaticResource {x:Type TextBlock}}" 引用。 还可以使用样式的 x:Key 扩展具有 x:Key 的样式。 例如,如果有一个名为 Header1 的样式,并且你需要扩展该样式,可以使用 BasedOn="{StaticResource Header1}"

6、TargetType 属性与 x:Key 属性之间的关系

如前所述,将 TargetType 属性设置为 TextBlock 时,如果不为样式分配 x:Key,会导致将样式应用于所有 TextBlock 元素。 在此情况下,x:Key 隐式设置为 {x:Type TextBlock}。 这意味着,如果将 x:Key 值显式设置为除 {x:Type TextBlock} 以外的任何值,则 Style 不会自动应用于所有 TextBlock 元素。 相反,必须将该样式(通过使用 x:Key 值)显式应用到 TextBlock 元素。 如果你的样式位于资源部分中,并且你未对样式设置 TargetType 属性,则必须设置 x:Key 属性。

除了为 x:Key 提供默认值以外,TargetType 属性还指定 setter 属性应用到的类型。 如果不指定 TargetType,则必须使用语法 Property="ClassName.Property",通过类名称限定 Setter 对象中的属性。 例如,必须将 Property 设置为 "TextBlock.FontSize" 或 "Control.FontSize",而不是设置 Property="FontSize"

另请注意,许多 WPF 控件由其他 WPF 控件的组合构成。 如果创建应用于某个类型的所有控件的样式,可能会产生意外结果。 例如,如果创建一个样式,该样式以 Window中的 TextBlock 类型为目标,那么,即使 TextBlock 是另一个控件(如 ListBox)的一部分,该样式也将应用于窗口中的所有 TextBlock 控件。

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

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

相关文章

Ansible的脚本---Playbook剧本编写

playbook的组成部分 1、 tasks&#xff1a;任务 在目标主机上需要执行的操作。使用模块定义这些操作。每个任务都是一个模块的调用。 2、 variables&#xff1a;变量 用于存储和传递数据。类似于shell脚本中的变量。变量可以自定义。可以在playbook当中定义为全局变量&…

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能&#xff0c;包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年&#xff0c;因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…

Springboot启动异常 OgnlException: sqlSelect [java.lang.NoSuchMethodError

完整的日志如下&#xff1a; Invocation of init method failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ew ! null and ew.sqlSelect ! null. Cause…

不忍学弟学妹受苦受难!!!逐一讲解发动机原理实验报告(1)

固体火箭发动机侵蚀燃烧测试实验 经过了愉快迷糊——哦不瑟瑟发抖——哦不痛不欲生的两天&#xff0c;终于和小伙伴们协力完成了西北工业大学航天学院发动机原理实验报告。具体的实验指导书均可在本人博客资源站下载。 固体火箭发动机侵蚀燃烧测试实验&#xff0c;嗯哼—— 实…

MySQL 事务的ACID特性

MySQL事务是什么&#xff0c;它就是一组数据库的操作&#xff0c;是访问数据库的程序单元&#xff0c;事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道&#xff0c;在MySQL 中&#xff0c;有不同的存储引擎&#xff0c;有的存储引擎比如…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue&#xff08;队列&#xff09;容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 &#xff08;一&#xff09;list构造函数 &am…

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器&#xff0c;用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一&#xff0c;而公考常识题作为公务员考试的重要组成部分&#xff0c;对于考生来说具有很高的分值。在这一模块的复习中&#xff0c;有以下几点可以帮助考生提高学习效率&#xff0c;一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

The Cherno C++笔记02

目录 Part 06 How the C Compiler Works 1.编译过程 2.C并不关心文件 3.翻译单元&#xff08;Translation Unit&#xff09; 4. 实际用代码感受一下编译过程 4.1 预处理 4.1.1 预处理的本质 4.1.2 预处理后的.i文件 4.1.3 骚操作 4.2 .asm文件&#xff08;汇编语言源文…

安装nodejs,配置环境变量并将npm设置淘宝镜像源

安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包&#xff0c;所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下&#xff1a;https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…

C++ 检测 是不是 com组件 的办法 已解决

在日常开发中&#xff0c;遇到动态库和 com组件库的调用 无法区分。检测是否com组件的办法 在头部文件&#xff0c;引入文件 如果能编译成功说明是 com组件&#xff0c;至于动态库如何引入&#xff0c;还在观察中 最简单办法 regsvr32 TerraExplorerX.dll 是com 组件 regs…

LLaMA开源大模型源码分析!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 花了一晚上照着transformers仓库的LLaMA源码&#xff0c;把张量并行和梯度保存的代码删掉&#xff0c;只留下模型基础结构&#xff0c;梳理了一遍LLaMA的模型结构。 今年四月份的时候&#xff0c;我第一次接触…

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好&#xff0c;我是二狗。 今天&#xff0c;有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试&#xff01; 当网友询问ChatGPT API调用查询模型的确切名称是什么时&#xff1f; ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

自动化测试架构设计必会知识点——对核心业务进行封装复用(附Java源码)

随着UI自动化测试工具可选性越来越多&#xff0c;工具也越来越稳定&#xff0c;前几年关于自动化测试架构设计的概念逐渐淡化&#xff0c;但是做自动化测试最重要的两点—— PO设计模式和核心业务的封装复用大家还是必须掌握的&#xff0c;前面的文章我已经介绍了什么是PO设计模…

基于 Sentry 的前端监控系统搭建(Linux)

一、前言 随着技术这几年的发展与沉淀&#xff0c;线上数据指标监控也变得尤为重要&#xff0c;研发人员和运营人员需要对线上的产品指标有所感知&#xff0c;同时风险也需要及时暴露&#xff0c;很多公司开始自建监控系统&#xff0c;但对于一些定制化要求不是特别高的团队&a…

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff0c;在浏览器中可以看到正常显示的页面教据&#xff0c;但是使用 requests 得到的结果并没有&#xff0c;这是因为requests 获取的都是原始的 HTML 文档…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…