25、Wpf之App资源应用
开发平台:Win10 64位
开发环境:VS2022(64位) Preview
.NET Framework:.NET 6
文章目录
- 一 Resources
- 1.1 Application中定义资源
- 1.2 样式(Styles)
- 1.3 模板(Templates)
- 1.4 数据转换器(Converters)
- 1.5 资源(Resources)
- 二 资源字典(ResourceDictionaries)
- 2.1 资源字典的两种定义方式
- 2.2 使用资源字典
- 三、总结
- 四、参考文献
一 Resources
wpf资源(Resources)是为了存储一系列我们常复用的对象,每个元素都有Resource属性。其实Resources的定义可以在每一个容器控件中(或者是在每一个控件,在Template 中可以用到),像C#中变量的定义一样,Resource的定义的地方不同决定它的作用范围,如:
- Window.Resources它的作用范围就是在Window容器里的所有子控件有效,也只有这些子控件才能引用/调用这些资源
- Grid.Resources它的作用范围就是在Grid容器里的所有子控件有效,也只有这些子控件才能引用/调用这些资源
以此类推…
注意:Window不是最上层的"容器",最上层的应该是Appication ,所以Application.Resources 的作用范围更大(有人把Application.Resource叫作全局资源,所有在这个Application下的容器控件等都可以使用,常用来做一个应该程序的Skin ,其ResourceDictionary定义的资源也类似 )
1.1 Application中定义资源
本文以Application.Resources为例,Window和Grid等控件使用资源(Resources)属性和Application类似,可参考Application。
Application.Resources属性是一个非常有用的特性,它允许开发者在应用程序级别集中管理资源,如样式(Styles)、模板(Templates)、数据转换器(Converters)等。这有助于实现一致的设计风格,并且方便维护和更新。
- 样式(Styles):样式(Styles):样式是一种资源,它定义了控件的外观和行为。样式可以应用于控件、元素、控件模板、数据模板、触发器、路由事件等。
- 模板(Templates):模板(Templates):模板是一种资源,它定义了控件的结构和布局。模板可以应用于控件、元素、控件模板、数据模板、触发器、路由事件等。
- 数据转换器(Converters):数据转换器是一种资源,它用于转换绑定源和目标之间的绑定值。
- 资源(Resources):Resources属性是一种资源,它可以包含任意类型的值。
- 资源字典(ResourceDictionaries):资源字典是一种资源,它可以包含多个样式、模板、数据转换器等资源。
下面是几种常用到的资源的在Application中的定义方式
1.2 样式(Styles)
样式(Styles)是一种资源,它定义了控件的外观和行为。样式可以应用于控件、元素、控件模板、数据模板、触发器、路由事件等。
<Application.Resources><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style>
</Application.Resources>
1.3 模板(Templates)
模板(Templates)是一种资源,它定义了控件的结构和布局。模板可以应用于控件、元素、控件模板、数据模板、触发器、路由事件等。
<Application.Resources><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate>
</Application.Resources>
1.4 数据转换器(Converters)
数据转换器(Converters)是一种资源,它用于转换绑定源和目标之间的绑定值。
<Application.Resources><local:MyConverter x:Key="MyConverter" />
</Application.Resources>
1.5 资源(Resources)
Resources是一种资源,它可以包含任意类型的值。
<Application.Resources><Color x:Key="MyColor">Red</Color><Thickness x:Key="MyThickness">10</Thickness><FontFamily x:Key="MyFontFamily">Arial</FontFamily><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="{StaticResource MyColor}" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style>
</Application.Resources>
以上几种方式定义的资源,都可以在XAML文件中使用,但是实际开发中没这么用的,一般都是放在资源字典中用,这样程序的可读写性更好。
二 资源字典(ResourceDictionaries)
2.1 资源字典的两种定义方式
资源字典(ResourceDictionaries)是一种资源,它可以包含多个样式、模板、数据转换器等资源。有两种定义方式:
- 内联定义:在Application.Resources中定义资源字典,并在其中定义其他资源(style、模板、转换器等资源)。
<Application.Resources><ResourceDictionary><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate><local:MyConverter x:Key="MyConverter" /></ResourceDictionary>
</Application.Resources>
- 外部定义:在外部定义资源字典文件,并在Application.Resources中引用。
单独写一个样式资源字典文件(Styles.xaml)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}"><Setter Property="Background" Value="White" /><Setter Property="BorderBrush" Value="Gray" /><Setter Property="BorderThickness" Value="1" /><Setter Property="Padding" Value="5" /></Style>
</ResourceDictionary>
然后在Application的资源中引用这个资源字典文件
<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Styles.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary>
</Application.Resources>
这样就可以在项目中使用ListBoxItem的样式了。
2.2 使用资源字典
因为资源字典定义在了Application中,因此在 XAML 文件中,可以通过控件的属性中设置资源的引用。
<Button Content="Click Me" Style="{StaticResource MyStyle}" />
<DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel>
</DataTemplate>
<local:MyConverter x:Key="MyConverter" />
<Color x:Key="MyColor">Red</Color>
<Thickness x:Key="MyThickness">10</Thickness>
<FontFamily x:Key="MyFontFamily">Arial</FontFamily>
在上面的例子中,我们定义了三个资源:MyStyle、MyDataTemplate、MyConverter。然后在按钮的 Content 属性中引用了 MyStyle,在 DataTemplate 的 DataTemplate 属性中引用了 MyDataTemplate,在 local:MyConverter 的 Converter 属性中引用了 MyConverter,在 Color、Thickness、FontFamily 的值中引用了 MyColor、MyThickness、MyFontFamily。
三、总结
当多个资源具有相同的名称时,WPF 会按照以下优先级来确定资源的使用:
- 样式(Styles)> 模板(Templates)> 数据转换器(Converters)> 资源字典(ResourceDictionaries)> 资源(Resources)
也就是说,如果有多个资源具有相同的名称,WPF 会按照样式、模板、数据转换器、资源字典、资源的顺序来确定使用哪个资源。
对于大型项目或者模块化开发,我们通常会把一些公共的样式、模板、数据转换器、资源字典等资源定义在单独的资源字典文件中,就是2.1中的外部定义方式,并通过引用的方式在项目中使用。这样可以避免资源的重复定义,提高代码的可维护性。比如我们会用到的控件样式,
在资源字典的使用中有些错误,下面是笔者遇到的
- 内联方式:在Application.Resources中定义资源字典。
<Application.Resources><ResourceDictionary><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /> </Style><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate><local:GenderConverter x:Key="GenderConverter" /></ResourceDictionary><!--样式(Styles)--><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style>
</Application.Resources>
把Style和ResourceDictionary换下位置
<Application.Resources><!--样式(Styles)-->
<Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" />
</Style>
<ResourceDictionary><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate><local:GenderConverter x:Key="GenderConverter" />
</ResourceDictionary>
</Application.Resources>
需要给ResourceDictionary一个key值
<ResourceDictionary x:Key="1">
这个时候是正常的,这个就是说,需要把资源字典(ResourceDictionary )放在其他的资源(style、模板、转换器等)的后面
个人观点:对于Application.Resources来说,styel、模板、转换器、资源字典都是一样的,所以需要像Style、DataTemplate一样添加key,不然在使用的时候没法区分是哪个资源字典
同时写两个即使填写了key也会报错,因为两个类型一样,就如同给Button控件设置了两次Content属性一样。但是在这两个ResourceDictionary 前面添加一个其他的资源(style、模板、转换器等),就不报错了,很费解。。。。。。
- 引用外部定义的资源字典
这个时候在Application.Resources节点下只写一个ResourceDictionary,没有style、模板、转换器等,且不对ResourceDictionary设置key
如果设置了key就会报如下错误。去掉key="1"就可以了
这样,<Application.Resources>下面只有一个节点,这个节点里面包含了其他资源。
<Application.Resources><ResourceDictionary ><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate><local:GenderConverter x:Key="GenderConverter" /></ResourceDictionary>
</Application.Resources>
进一步的引用外部定义的资源字典,这个结构是<Application.Resources>下面只有一个节点,这个节点里面除了包含style、模板、转换器等资源外还添加了外部资源字典,这个外部资源字典被合并到一起了,统一在<ResourceDictionary.MergedDictionaries>这个节点下面,和上面的不同点是<ResourceDictionary.MergedDictionaries>充当了Style、DataTemplate等资源的角色。
<Application.Resources> <ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" /><ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign3.Defaults.xaml" /><ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" /><ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Secondary/MaterialDesignColor.Lime.xaml" /><ResourceDictionary Source="pack://application:,,,/BlankApp1;component/Res/Geometry.xaml"/><ResourceDictionary Source="pack://application:,,,/BlankApp1;component/Res/Style.xaml"/><ResourceDictionary Source="pack://application:,,,/BlankApp1;component/Res/Colors.xaml"/><ResourceDictionary Source="pack://application:,,,/BlankApp1;component/Res/DataGrid.xaml"/><ResourceDictionary><convert:VisibilityToInverseVisibilityConverter x:Key="InverseVisibility"/></ResourceDictionary></ResourceDictionary.MergedDictionaries><!--样式(Styles)--><Style x:Key="MyStyle" TargetType="Button"><Setter Property="Background" Value="Red" /><Setter Property="Foreground" Value="White" /><Setter Property="FontSize" Value="16" /></Style><!--模板(Templates)--><DataTemplate x:Key="MyDataTemplate"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></DataTemplate><!--数据转换器(Converters)--><convert:VisibilityToInverseVisibilityConverter x:Key="InverseVisibility"/><!--资源(Resources)--><Color x:Key="MyColor">Red</Color><Thickness x:Key="MyThickness">10</Thickness><FontFamily x:Key="MyFontFamily">Arial</FontFamily></ResourceDictionary>
</Application.Resources>
四、参考文献
- 4.1 https://blog.csdn.net/hustlei/article/details/86699209
相关文章:

25、Wpf之App资源应用
开发平台:Win10 64位 开发环境:VS2022(64位) Preview .NET Framework:.NET 6 文章目录 一 Resources1.1 Application中定义资源1.2 样式(Styles)1.3 模板(Templates)1.4 数据转换器(…...

【深度好文】反模式:10种滥用设计模式案例分析
Hello,大家好,我是V哥。很多文章都在介绍设计模式怎么用,讲解设计模式的原理等等,设计模式的思想是编程中的精髓,用好了可以让代码结构利于维护和扩展,同时代码风格也更加优雅,V 哥也写过这样一…...

OkHttp Interceptor日志上报
最近为了做一些网络上的优化,所以就得提前埋点,为后续网络优化提供数据支持。 主要是对发起请求埋点,请求错误埋点,客户端请求耗时埋点。 事件上报到阿里云,接入的是阿里的应用实时监控服务。 网络请求使用的是OhHttp…...

高性能反向代理--HAProxy
文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…...

数据结构应用实例(四)——最小生成树
Content: 一、问题描述二、算法思想三、代码实现四、两种算法的比较五、小结 一、问题描述 利用 prim 算法和 kruskal 算法实现最小生成树问题; 二、算法思想 首先判断图是否连通,只有在连通的情况下才进行最小树的生成; 三、代…...

为OneAPI配置MySQL数据库及设置开机启动
OneAPI启动时,如果发现没有数据库他会在项目根目录自动创建SqlLit,为提高OneAPI的性能及管理,这里给出一个使用MySQL数据库的案例,同时本文介绍如何在源码部署的情况下,设置OneAPI的开机自动启动。 OneAPI的源代码安装…...

完整的k8s搭建服务器流程
一、准备 1、禁用selinux #临时禁用 setenforce 0 #永久禁用 sed -i s/enforcing/disabled/ /etc/selinux/config #检查selinux是否已禁用 sestatus 2、禁用交换分区 #命令行临时禁用 swapoff -a #永久禁用 vim /etc/fstab 注释掉有swap字样的那行,重启 3、允许…...

【Petri网导论学习笔记】Petri网导论入门学习(一)
Petri 网导论 如需学习转载请注明原作者并附本帖链接!!! 如需学习转载请注明原作者并附本帖链接!!! 如需学习转载请注明原作者并附本帖链接!!! 发现网上关于Petri网的学习…...

Zabbix监控自动化
监控在运维工作中所占的比例为 30%左右,监控做得好,会省很多事,让工作能有序地进行。理想的监控应该是自动化的,只需要配置规则,即可自动完成所有的事情,比如主机的自动添加和注册、模板的自动添加、分组的…...

pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi 定制SVI目标和培训循环,变更推理
定制SVI目标和培训循环 Pyro支持各种基于优化的贝叶斯推理方法,包括Trace_ELBO作为SVI(随机变分推理)的基本实现。参见文件(documents的简写)有关各种SVI实现和SVI教程的更多信息I, 二,以及罗马数字3了解SVI的背景。 在本教程中…...

Openeuler22 部署 RackTables0.22.0
目录 0、前言 一、部署lamp环境,lamp环境测试 1、部署Apache,apache环境测试 2、部署php、mysql,php环境测试 二、放文件 三、配置mysql 四、安装racktables 第一步、点击proceed继续 第二步、点击proceed 第三步、根据提示进行操作…...

从传统到智能:高标准农田灌区信息化助力农业现代化
从传统农业的粗放式管理,到如今智能化、精准化的现代农业转型,高标准农田灌区信息化建设无疑是推动这一历史进程的关键力量。它不仅标志着农业生产方式的根本性变革,还深刻影响着农业资源的高效利用与可持续发展策略,为实现农业现…...

堆排序-建堆,增删替换
我们 之前写过根据 堆排序的优先级队列,但是如果我们想要建立一个堆怎么办呢? 如何实现上浮 下潜 具体看这篇文章 堆排序-优先级队列-CSDN博客 建堆 我们有两种方法建立一个堆 1.我们基于add方法建立一个堆,一次次的add,然后对…...

使用AI写WebSocket知识是一种怎么样的体验?
一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口,才能获取到服务器的数据。例如前后端分离的开发场景,自嘲为切图仔的前端大佬找你要一个配置信息的接口,我们后端开发三下两下开…...

若依系统(Security)增加微信小程序登录(自定义登录)
若依系统(分离版后端)自带的账号验证是基于 UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(username, password); 验证,然后在系统中controller或service类中 SecurityUtils 工具类中直接可获取用户或用户…...

道可云人工智能元宇宙每日资讯|2024互联网岳麓峰会在长沙召开
道可云元宇宙每日简报(2024年9月10日)讯,今日元宇宙新鲜事有: 2024互联网岳麓峰会在长沙召开 9月9日,2024互联网岳麓峰会在长沙召开,湖南省副省长曹志强在峰会表示,今年上半年湖南省人工智能产…...

MySQL JDBC URL各参数详解
jdbc:mysql://localhost:3306/test?userroot&password123456&useUnicodetrue&characterEncodinggbk &autoReconnecttrue&failOverReadOnlyfalse&serverTimezoneUTC&drivercom.mysql.cj.jdbc.Driver 参数名称参数说明缺省值user指定用于连接数据库…...

celery control.shutdown
Celery 提供了 control 模块,允许你发送控制命令给正在运行的 worker。其中 shutdown 命令可以用来关闭一个或多个 worker。下面是如何使用 control.shutdown 来关闭 worker 的详细说明。 使用 control.shutdown 1. 导入必要的模块 首先,你需要导入 C…...

数据库设计与软件工程阶段的对应关系
数据库设计的很多阶段确实可以与软件工程的各阶段对应起来,这体现了数据库设计作为软件工程中一个核心组成部分的紧密关联性。 1. 需求分析阶段 数据库设计:需求分析是数据库设计的初始阶段,主要任务是收集和分析用户的需求,包括…...

基于ASP+ACCESS的教师信息管理系统
摘要 随着我国社会主义市场经济的发展和改革开放的不断深入,计算机的应用已遍及国民经济的各个领域,计算机来到我们的工作和生活中,改变着我们和周围的一切。在以前,学校用手工处理教师档案以及工资发放等繁多的工作和数据时&…...

【智能体】浅谈大模型之AI Agent
随着ChatGPT推出插件和函数调用功能,构建以LLM(大语言模型)为核心控制器的AI Agent愈发成为一个拥有无限可能的概念。 AI Agent是一种超越简单文本生成的人工智能系统。它使用大型语言模型(LLM)作为其核心计算引擎&am…...

大疆 嵌入式 笔记 面试题目汇总大全[嵌入式找工作必看] 比较有难度适合进阶收藏学习
24届大疆车载嵌入式系统安全面试经验 投递岗位:(大疆车载)嵌入式系统安全 投递时间:大疆大概在7月-8月月初开秋招岗位。8月月中开始笔试,8月月末开始面试。(理论上9月,10月开奖。)…...

线程池以及详解使用@Async注解异步处理方法
目录 一.什么是线程池: 二.使用线程池的好处: 三.线程池的使用场景: 四.使用线程池来提高Springboot项目的并发处理能力: 1.在application.yml配置文件中配置: 2.定义配置类来接受配置文件内的属性值:…...

css鼠标移动过去变成手的图标
在css中定义 cursor:pointer;直接在html中指定 <div class"mt-2 mt-md-2 mt-lg-1 fs-md-1 fs-lg-2 " style"cursor:pointer;"></div>...

uniapp 懒加载、预加载、缓存机制深度解析
uniapp 懒加载、预加载、缓存机制深度解析 文章目录 uniapp 懒加载、预加载、缓存机制深度解析一、为什么要使用uniapp的懒加载、预加载和缓存机制二、如何使用uniapp的懒加载、预加载和缓存机制1. 懒加载2. 预加载3. 缓存机制 四、扩展与高级技巧1. 结合懒加载和预加载优化页面…...

《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)
文章目录 一、图像形态学基本概念二、基本运算1.简单介绍2.代码实现 三、高级运算1.简单介绍2.代码实现 一、图像形态学基本概念 图像形态学是图像处理科学的一个独立分支,它基于集合论和数学形态学的理论,专门用于分析和处理图像中的形状和结构。图像形…...

【Rust光年纪】海洋学研究的利器:Rust语言海洋学计算库详解
探索Rust语言下的海洋学计算库:功能对比与选择指南 前言 随着科学技术的不断发展,海洋学领域对于计算和数据处理的需求也日益增长。在Rust语言中,出现了一系列专注于海洋学计算和数据处理的库,它们为海洋学工作者提供了强大的工…...

Word文档的读入【2】
现在,乔老师已经了解了Word文档的基本结构。 下面,我们通过观察一份答题卡来思考一下每条信息的具体位置。这样,在后面几天的学习和操作中,我们就能更快、更准确地读取到答题卡中的信息。 这份答题卡是由一个表格和一些段落组成。…...

报名开启 | 游戏开发缺队友?首期繁星招聘会来袭!
**点击蓝链领取游戏开发教程 ** EE GAMES 创作者社区是专注于链接每一位游戏创作者,提供社区交流、团队匹配、经验共享、成果展示、知识整合、最新活动资讯等全方位服务的游戏领域垂类社区。 这里不仅仅是一个游戏创作的互助平台,更是每一位游戏创作者…...

无法加载源https://api.nuget.org/v3/index.json的服务索引
我是用的visual studio2022 17.11.2版本,在运行.net c#项目的时候显示“无法加载源https://api.nuget.org/v3/index.json的服务索引”,从网上找了一堆方法全部没用,最后用这个方法解决了。亲测有效家人们 关闭VS,删除C:\Users\xx…...