25、Wpf之App资源应用

news2024/12/28 18:51:59

开发平台: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

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

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

相关文章

微信自动通过好友和自动拉人进群,微加机器人这个功能太好用了

又发现一个好用的功能&#xff0c;之前就想找一个这种工具&#xff0c;现在发现可以利用微加机器人的两个功能来实现&#xff0c;分别是加好友和关键词拉群 首先 微加机器人的专业版 > 功能 > 加好友设置 可以设置一个关键词通过,这样别人加好友的时候只需要输入制定内…

无人机遂行编队飞行中的纯方位无源定位(2022数模国赛B题)

文章目录 论文项目地址 数模国赛前的练手题&#xff0c;实力不够&#xff0c;参考了好多论文才写出来&#xff0c;个人感觉思路应该没什么大问题&#xff0c;供大家参考 论文 项目地址 github&#xff1a;UAVFormationFlight gitee&#xff1a;UAVFormationFlight 项目包含 完…

数据处理脚手架PyODPS入门体验

本文分享了初次使用PyODPS&#xff08;Python版的Open Data Processing Service&#xff09;的心路历程。作者通过实际案例&#xff0c;深入浅出地探讨了PyODPS相较于传统ODPS SQL在数据处理上的灵活性与便捷性&#xff0c;特别是在处理复杂JSON字段统计与多条件筛选方面展现出…

基于verilog的流水线CPU(无中断异常)

突然发现这个还没传&#xff0c;懒得写了&#xff0c;直接把实验报告传上来吧。 流水线CPU实验报告 ​ 本实验最终实现了11条指令&#xff0c;完成了2位控制的分支预测&#xff0c;以及load-use的阻塞&#xff0c;jump的阻塞&#xff0c;beq预测失败的阻塞&#xff0c;还有RA…

《2024中国数据要素产业图谱2.0版》重磅发布

数据猿出品 本次“数据猿2024年度三大媒体策划活动——《2024中国数据要素产业图谱2.0版》”的发布&#xff0c;下一次版本迭代将于2024年12月底发布2024年3.0版&#xff0c;敬请期待&#xff0c;欢迎报名。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着技术不断革新&a…

C++函数在库中的地址

本文讲述C如何直接调用动态库dll或者so中的函数。 首先我们准备一个被调用库&#xff0c;这个库里面有两个函数&#xff0c;分别是C98 与 C11 下的&#xff0c;名称是run2和run1。 被调用库 相关介绍请看之前的文章《函数指针与库之间的通信讲解》。 //dll_ex_im.h #ifndef…

【通俗理解】二项分布的均值与方差——从成功与失败的概率看分布

【通俗理解】二项分布的均值与方差——从成功与失败的概率看分布 关键词提炼 #二项分布#均值#方差#成功概率#失败概率#伯努利试验 公式解释与案例 二项分布的基本公式 二项分布描述的是在n次独立重复的伯努利试验中&#xff0c;成功次数的概率分布。每次试验的成功概率为p&…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址&#xff1a;https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上&#xff0c;bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

如何用 OBProxy 实现 OceanBase 的最佳路由策略

引言 OBProxy&#xff0c;即OceanBase Database Proxy&#xff0c;也简称为ODP&#xff0c;是 OceanBase数据库的专属服务代理。通过应用OBProxy&#xff0c;由后端OceanBase集群的分布式特性所带来的复杂性得以屏蔽&#xff0c;从而使得访问分布式数据库的体验如同访问单机数…

linux上用yolov8训练自己的数据集(pycharm远程连接服务器)

pycharm如何远程连接服务器&#xff0c;看之前的文章 首先去GitHub上下载项目地址&#xff0c;然后下载预训练模型放到项目主目录下 然后下载数据集&#xff0c;我这有个推荐的数据集下载网站&#xff0c;可以直接下载yolov8格式的数据集&#xff08;还支持其他格式的数据集&a…

进程间通信-命名管道

目录 原理 代码 简单通信 回归概念 原理 mkfifo 是 Linux 系统中的一个命令&#xff0c;用于创建命名管道&#xff08;named pipe&#xff09;&#xff0c;也称为 FIFO&#xff08;First In, First Out&#xff09;。命名管道是一种特殊类型的文件&#xff0c;用于进程间通…

从0到1!本地部署一个大语言模型!完整方法!

要想从零开始部署一个**大语言模型&#xff08;LLM&#xff09;**到本地&#xff0c;不仅仅是硬件上安装软件包&#xff0c;还需要对模型选择、优化和应用搭建有一定的理解。下面是一份完整教程&#xff0c;手把手带你走过如何在本地环境中部署LLM。 1. 了解部署需求与硬件准备…

交换机链路聚合

一、概述 通过链路聚合&#xff0c;可以提高链路的可靠性&#xff0c;提升链路带宽。链路具有一般有手工模式和LACP模式。 二、拓扑图 三、实操演练 1、手工模式 手工模式一般用于老旧、低端设备。 缺点&#xff1a; &#xff08;1&#xff09;为了使链路聚合接口正常工作…

brew install node提示:Error: No such keg: /usr/local/Cellar/node

打开本地文件发现Cellar目录下无法生成 node文件&#xff0c;应该是下载时出现问题&#xff0c;重复下载无法解决问题&#xff0c;只能重新安装brew。 步骤1&#xff08;安装 brew&#xff09;&#xff1a; /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…

打造高效实时数仓,从Hive到OceanBase的经验分享

本文作者&#xff1a;Coolmoon1202&#xff0c;大数据高级工程师&#xff0c;专注于高性能软件架构设计 我们的业务主要围绕出行领域&#xff0c;鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战&#xff0c;我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选…

uniapp离线(本地)打包

安卓离线打包 注意&#xff1a;jdk建议选择1.8 下载Android Studio配置gradle仓库地址 第一步&#xff1a;先下载对应的版本&#xff0c;进行压缩包解压 第二步&#xff1a;在电脑磁盘&#xff08;D盘&#xff09;&#xff0c;创建文件夹存放压缩包并进行解压&#xff0c;并创…

8.8canny算子检测

目录 实验原理 示例代码 运行结果 实验原理 在OpenCV中&#xff0c;Canny边缘检测是一种广泛使用的边缘检测算法。它是由John F. Canny在1986年提出的&#xff0c;并且因其性能优良而被广泛应用。在OpenCV中&#xff0c;Canny边缘检测是通过Canny函数实现的。 函数原型 v…

【爬虫软件】小红书按关键词批量采集笔记,含笔记正文、转评赞藏等!

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff01; 现在…

HuggingFists算子能力扩展-PythonScript

HuggingFists作为一个低代码平台&#xff0c;很多朋友会关心如何扩展平台算子能力。扩展平台尚不支持的算子功能。本文就介绍一种通过脚本算子扩展算子能力的解决方案。 HuggingFists支持Python和Javascript两种脚语言的算子。两种语言的使用方式相同&#xff0c;使用者可以任选…

C++速通LeetCode简单第3题-相交链表

简单解&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {Li…