什么叫WPF的资源(Resource)

资源是保存在可执行文件中的一种不可执行数据。WPF中资源用ResourceDictionary类表示,这个类就是一个字典,字典的key和value都是object类型。所以在WPF中,资源可以可以是图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。 也就是说,应用程序中非程序代码的内容,比如点阵图、颜色、字型、动画/影片档以及字符串常量值,可将它们从程序中独立出来,单独包装成"资源(Resource)"。 静态资源(Static Resource),动态资源(Dynamic Resources)。这两者的区别是:静态资源在第一次编译后即确定其对象或值,之后不能对其进行修改。 动态资源则是在运行时决定,当运行过程中真正需要时,才到资源目标中查找其值。因此,我们可以动态地修改它。由于动态资源的运行时才能确定其值,因此效率比静态资源要低。

在WPF中,StaticResource 和 DynamicResource 是用于引用资源(如样式、模板、颜色等)的两种方式。它们的主要区别在于资源的解析时机和适用场景。StaticResource静态资源只会被加载一次,在整个WPF的生命周期中不会再次修改。DynamicResource动态资源在运行时可随便变化的资源。

下面我们从资源的加载时机、性能和使用场景 三个方面依次介绍这两种资源。

StaticResource

加载时机:在 XAML 加载时(编译时)解析资源。
性能:性能较高,因为资源在加载时就被解析并固定下来。
适用场景:适用于资源在运行时不会发生变化的情况。

DynamicResource

加载时机:在运行时(需要时)解析资源。
性能:性能稍低,因为资源在运行时动态查找。
适用场景:适用于资源可能在运行时发生变化的情况,例如支持主题切换。

介绍完这两种资源的主要概念和区别之后,接下来我们就来介绍下,如何在WPF中使用这两种资源。

StaticResource

WPF中,静态资源可以定义在独立的xaml资源 文件中、可以定义在窗体的xaml文件中、可以定义在App.xaml全局文件、定义在控件模板或者样式中。

1、在独立的资源文件中定义xaml文件

我们定义一个单独的资源文件Res.xaml,里面定义一个资源。内容 如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="PrimaryBrush" Color="Blue"></SolidColorBrush>
</ResourceDictionary>

然后我们在MainWindow.xaml可以直接引用这个资源文件,然后使用这个静态资源PrimaryBrush

<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Res.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button Content="test" Background="{StaticResource PrimaryBrush}"></Button>
</Grid>

2、在窗体的xaml文件中定义资源

我们在MainWindow.xaml中可以直接定义资源,然后引用。

<Window.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="PrimaryBrush" Color="Blue"></SolidColorBrush>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button Content="test" Background="{StaticResource PrimaryBrush}"></Button>
</Grid>

3、在App.xaml全局文件中定义资源

在App.xaml中定义的资源文件,可以在当前项目的任何地方直接引用。但是注意 ,第一种方法或者第二种方法也定义了相同key的静态资源,窗体中的定义和静态资源文件中的定义会覆盖App.xaml中定义的静态资源。

<Application.Resources>
<SolidColorBrush x:Key="PrimaryBrush" Color="Blue"></SolidColorBrush>
</Application.Resources>

4、在Style样式中定义资源

因为WPF的Style类中有一个属性表示资源,所以我们可以为Style定义静态资源,然后再Style定义中使用静态资源。

<Style TargetType="{x:Type Button}">
<Style.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="ButtonForegroundBrush" Color="Red" />
</ResourceDictionary>
</Style.Resources>
<Setter Property="Foreground" Value="{StaticResource ButtonForegroundBrush}" />
</Style>

StaticResource资源的查找方式

假设我们在不同的位置定义了一个同名key的静态资源,当有控件引用这个静态资源的时候,该使用哪个呢?其实静态资源的查找是有一个固定顺序的,最先查找到谁,就用谁。

(1)查找使用该资源的元素的Resource字典;
(2)顺着逻辑树向上查找父元素的资源字典,直到根节点;
(3)查找Application资源(App.xaml资源);

x:Static

StaticResource主要用于引用 XAML文件中定义的资源(如颜色、样式、模板等),在xaml加载的时候解析。但是如果我的资源不是定义在资源文件中,而是定义在一个普通类中的静态字段,该如何引用了。这个时候x:Static就派上场了,x:Static用于引用静态字段、静态属性、常量或枚举值。

假设我们定义一个类:Constants,里面有一个静态字段:AppTitle

public class Constants
{
public const string AppTitle = "My Application";
}

在xaml中,我们可以直接通过x:Static引用这个资源。这里的local是一个命名空间的别名。

<Button Content="{x:Static local:Constants.AppTitle}"></Button>

DynamicResource

DynamicResource和StaticResource资源的定义方式都是一致的,唯一的不同就是,当资源内容被修改之后,静态资源引用的地方不会有任何变化。我们用下面的代码做演示:

<Window.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="PrimaryBrush" Color="Blue"></SolidColorBrush>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<Button Foreground="{StaticResource PrimaryBrush}">测试按钮</Button>
<Button Foreground="{DynamicResource PrimaryBrush}">测试按钮</Button>
<Button Click="Button_Click" Content="修改资源"/>
</StackPanel>

上面代码中有一个定义好的资源PrimaryBrush,两个Button分别以静态方式和动态方式引用。在第三个按钮的点击事件中,我们修改以下资源内容,就会发现,只有动态资源引用的地方前景色发生了变化。

private void Button_Click(object sender, RoutedEventArgs e)
{
this.Resources["PrimaryBrush"] = new SolidColorBrush(Colors.Red);
}

点击按钮后,执行效果如下:

原文链接:http://cshelloworld.com/home/detail/1910955200127045632

WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?的更多相关文章

  1. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...

  2. WPFの静态资源(StaticResource)和动态资源(DynamicResource)

    下面是前台代码: <Window.Resources>        <TextBlock x:Key="res1" Text="好好学习"/ ...

  3. 静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍了WPF的静态资源和动态资源的基本使用,并对两者做了简单的比较. 二.定义并使用资源 <Window x:Class="Demo010.MainWindow&q ...

  4. zzy:请求静态资源和请求动态资源, src再次请求服务器资源

    [总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...

  5. servlet基本原理(手动创建动态资源+工具开发动态资源)

    一.手动开发动态资源 1 静态资源和动态资源的区别 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. <scr ...

  6. WPF基础篇之静态资源和动态资源

    静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 一.定义 ...

  7. wpf中静态资源和动态资源的区别

    静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源.

  8. 0055 <mvc:default-servlet-handler />不能同时访问静态资源和动态资源的问题

    刚才在折腾的时候,发现applicationContext.xml中配置了<mvc:default-servlet-handler />后,能访问静态资源,却不能访问动态资源了:注释掉之后 ...

  9. WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)

    原文:WPF 资源(StaticResource 静态资源.DynamicResource 动态资源.添加二进制资源.绑定资源树) 一.WPF对象级(Window对象)资源的定义与查找 实例一: St ...

  10. 静态资源(StaticResource)和动态资源(DynamicResource)

    静态资源(StaticResource)和动态资源(DynamicResource) 资源可以作为静态资源或动态资源进行引用.这是通过使用 StaticResource 标记扩展或 DynamicRe ...

随机推荐

  1. linux命令操作android手机

    目的 通过一台linux机器操作android手机做一些常用的操作 复杂的操作都是由简单操作开始的, 可以自行发掘 环境 笔记本: thinkpad t480 操作系统: archlinux adb版 ...

  2. SOUI4中使用文件资源

    一直以前SOUI中引用资源都是通过uires.idx中定义资源类型及路径,比如: <?xml version="1.0" encoding="utf-8" ...

  3. Qemu-KVM基本工作原理介绍

    本文分享自天翼云开发者社区<Qemu-KVM基本工作原理介绍>,作者:郑****文 1.KVM与Qemu关系 Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实 ...

  4. Codeforces 1749E Cactus Wall 题解 [ 紫 ] [ 01 BFS ] [ 图论建模 ] [ 构造 ] [ adhoc ]

    一道很好的思维题,被教练碾压了. 观察 首先从题目给的样例入手: 5 5 ..... ..... ..... ..... ..... 这种情况最终的答案是: YES ....# ...#. ..#.. ...

  5. Spring单元测试(一)入门与实践

    问题:如何快速测试,而不是每次测试都要重启应用? 目标:尽量只测试局部代码 不同的测试 软件工程中分为:单元测试.集成测试.功能测试.系统测试.其中功能测试和系统测试一般是测试人员的责任,但单元测试和 ...

  6. Java进阶 - [1-5] 泛型

    一.什么是泛型   早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序并不安全.   针对List.Set.Map等集合类型,它们对存储的元素类型是没有任何限制的.例如 ...

  7. win - [01] 修改网络连接名称(网络1、网络2...网络10)

    修改网络连接的名称 1.打开运行窗口:Windows 键 + R 2.在运行窗口输入 regedit,打开注册表编辑器 3.在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsof ...

  8. 推荐一款最新开源,基于AI人工智能UI自动化测试工具!支持自然语言编写脚本!

    随着互联网技术的飞速发展,Web应用越来越普及,前端页面也越来越复杂.为了确保产品质量,UI自动化测试成为了开发过程中不可或缺的一环.然而,传统的UI自动化测试工具往往存在学习成本高.维护困难等问题. ...

  9. 「一」nginx介绍

    应用场景 静态资源(js.css.图片 ) 反向代理 缓存加速(动态资源),比如社区活跃度排名 负载均衡(动态扩容.容灾) API服务 一个请求先经过nginx,再到应用服务器,访问数据库/redis ...

  10. 不上苹果的app store,安装ios应用最简单的方法

    不上架appstore,安装app有两种方法,一种是使用企业类型的苹果开发者账号的In house类型的证书和证书profile文件打包,一种是使用个人/公司类型的苹果开发者账号的ad hoc类型的证 ...