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

资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。

StaticResource 通过替换已定义资源的值来为 XAML 属性提供值。

DynamicResource 通过将值推迟为对资源的运行时引用来为XAML 属性提供值。动态资源引用强制在每次访问此类资源时都重新进行查找。

通常来说,不需要在运行时更改的资源使用静态资源;而需要在运行时更改的资源使用动态资源。动态资源需要使用的系统开销大于静态资源的系统开销。例如以下的例子:

   1: <Window x:Class="WPFResource.StaticAndDynamicResource"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     Title="StaticAndDynamicResource" Height="200" Width="300">
   5:     <Window.Resources>
   6:         <SolidColorBrush x:Key="ButtonBrush" Color="Red" />
   7:     </Window.Resources>
   8:     
   9:     <StackPanel>
  10:         <Button Margin="5" Content="Static Resource Button A" Background="{StaticResource ButtonBrush}" />
  11:         <Button Margin="5" Content="Static Resource Button B" Background="{StaticResource ButtonBrush}">
  12:             <Button.Resources>
  13:                 <SolidColorBrush x:Key="ButtonBrush" Color="Yellow" />
  14:             </Button.Resources>
  15:         </Button>
  16:         <Button Margin="5" Content="Change Button Resource" Click="Button_Click" />
  17:         <Button Margin="5" Content="Dynamic Resource Button A" Background="{DynamicResource ButtonBrush}" />
  18:         <Button Margin="5" Content="Dynamic Resource Button B" Background="{DynamicResource ButtonBrush}">
  19:             <Button.Resources>
  20:                 <SolidColorBrush x:Key="ButtonBrush" Color="Yellow" />
  21:             </Button.Resources>
  22:         </Button>
  23:     </StackPanel>
  24: </Window>
   1: private void Button_Click(object sender, RoutedEventArgs e)
   2: {
   3:     SolidColorBrush brush = new SolidColorBrush(Colors.Green);
   4:     this.Resources["ButtonBrush"] = brush;
   5: }

以上的例子在运行时显示如下:

而点击“Change Button Resource”按钮后,显示的结果为:

从程序执行的结果来看,我们可以得到如下的结论:

  • 静态资源引用是从控件所在的容器开始依次向上查找的,而动态资源的引用是从控件开始向上查找的(即控件的资源覆盖其父容器的同名资源)
  • 更改资源时,动态引用的控件样式发生变化(即"Dynamic Resource Button A"发生变化)

如果要更改"Dynamic Resource Button B"的背景,需要在按钮的事件中添加以下代码(将"Dynamic Resource Button B"的控件的x:Name设置为"btn4")

   1: SolidColorBrush brushB = new SolidColorBrush(Colors.Blue);
   2: this.btn4.Resources["ButtonBrush"] = brushB;

执行的结果如下:

静态资源引用最适合于以下情况:

  • 您的应用程序设计几乎将所有的应用程序资源集中到页或应用程序级别的资源字典中。静态资源引用不会基于运行时行为(例如重新加载页)进行重新求值,因此,根据您的资源和应用程序设计避免大量不必要的动态资源引用,这样可以提高性能。

  • 您正在设置不在 DependencyObject 或 Freezable 上的属性的值。

  • 您正在创建将编译为 DLL 并打包为应用程序的一部分或在应用程序之间共享的资源字典。

  • 您正在为自定义控件创建一个主题,并定义在主题中使用的资源。对于这种情况,通常不需要动态资源引用查找行为,而需要静态资源引用行为,以使该查找可预测并且独立于该主题。使用动态资源引用时,即使是主题中的引用也会直到运行时才进行求值,并且在应用主题时,某个本地元素有可能会重新定义您的主题试图引用的键,并且本地元素在查找中会位于主题本身之前。如果发生该情况,主题将不会按预期方式运行。

  • 您正在使用资源来设置大量依赖项属性。依赖项属性具有由属性系统启用的有效值缓存功能,因此,如果您为可以在加载时求值的依赖项属性提供值,该依赖项属性将不必查看重新求值的表达式,并且可以返回最后一个有效值。该方法具有性能优势。

  • 您需要为所有使用者更改基础资源,或者需要通过使用 x:Shared 属性为每个使用者维护独立的可写实例。

动态资源最适合于以下情况:

  • 资源的值取决于直到运行时才知道的情况。这包括系统资源,或用户可设置的资源。例如,您可以创建引用由 SystemColors、SystemFonts 或 SystemParameters 公开的系统属性的 setter 值。这些值是真正动态的,因为它们最终来自于用户和操作系统的运行时环境。您还可以使用可以更改的应用程序级别的主题,在此情况下,页级别的资源访问还必须捕获更改。

  • 您正在为自定义控件创建或引用主题样式。

  • 您希望在应用程序生存期调整 ResourceDictionary 的内容。

  • 您有一个存在依存关系的复杂资源结构,在这种情况下,可能需要前向引用。静态资源引用不支持前向引用,但动态资源引用支持,因为资源直到运行时才需要进行求值,因此,前向引用不是一个相关概念。

  • 从编译或工作集角度来说,您引用的资源特别大,并且加载页时可能无法立即使用该资源。静态资源引用始终在加载页时从 XAML 加载;而动态资源引用直到实际使用时才会加载。

  • 您要创建的样式的 setter 值可能来自受主题或其他用户设置影响的其他值。

  • 您正在将资源应用到元素,而在应用程序生存期中可能会在逻辑树中重新设置该元素的父级。更改此父级还可能会更改资源查找范围,因此,如果您希望基于新范围对重新设置了父级的元素的资源进行重新求值,请始终使用动态资源引用。

不同类型的资源

1、程序集资源。这种常见于将图片设定到程序集中,做为程序集的资源。

程序集资源在定义时,将文件复制到解决方案-项目所在的目录或其子目录中,并将文件的属性中的Build Action设置为Resource。(注意,WPF不支持项目属性中的资源)

然后在XAML文件中使用如Image的Source属性,指定到此文件:

   1: <StackPanel Background="#FFC7DAFF">
   2:     <TextBlock Margin="5" Text="Assembly Resource" />
   3:     <Image Margin="5" Source="Image/Users.png" Width="32" Height="32" />
   4:     <Button Margin="5">
   5:         <Button.Content>
   6:             <StackPanel Orientation="Horizontal">
   7:                 <Image Margin="5" Source="Image/Users.png" Width="32" Height="32" />
   8:                 <TextBlock Text="My Button" VerticalAlignment="Center" />
   9:             </StackPanel>
  10:         </Button.Content>
  11:     </Button>
  12: </StackPanel>

此项目编译后,在Assembly中将封装该图片文件。此种方法适用于较小的资源。

2、对象资源

除刚刚我们使用的图片做为程序集资源外,前面例子中所使用的资源均是对象资源。系统对于对象资源使用ResouceDictionary这个字典集合处理,其Key对应即x:Key声明的键,Value对应资源。我们前面使用的都是SolidColorBrush对象,再例如使用字符串及ImageBrush对象做为资源:

   1: <StackPanel Background="#FFE6FDC8">
   2:     <StackPanel.Resources>
   3:         <c:String x:Key="strMessage">My String Value.</c:String>
   4:         <ImageBrush x:Key="imgBrush" ImageSource="Image/Users.png"
   5:                     ViewportUnits="Absolute" Viewport="0 0 32 32"/>
   6:     </StackPanel.Resources>
   7:     <TextBlock Margin="5" Text="Object Resource" />
   8:     <TextBox Margin="5" Text="{StaticResource strMessage}" />
   9:     <Button Margin="5" Height="32" HorizontalContentAlignment="Right" 
  10:             Content="{StaticResource strMessage}" 
  11:             Background="{StaticResource imgBrush}" Width="125" />
  12: </StackPanel>

程序执行结果为:

静态资源(StaticResource)和动态资源(DynamicResource)的更多相关文章

  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 ...

随机推荐

  1. Java Tuple使用实例(转)

    转自链接:http://www.cnblogs.com/davidwang456/p/4514659.html 一.为什么使用元组tuple? 元组和列表list一样,都可能用于数据存储,包含多个数据 ...

  2. css给奇数行或偶数行添加指定样式

    odd表示奇数行,even表示偶数行; tr:nth-child(odd); .table-striped > tbody > tr:nth-child(odd) { background ...

  3. 构建基于TCP的应用层通信模型

    各层的关系如下图,表述的是两个应用或CS间通信的过程:   通常使用TCP构建应用时,需要考虑传输层的通信协议,以便应用层能够正确识别消息请求.比如,一个请求的内容很长(如传文件),那肯定要分多次发送 ...

  4. C++卷积神经网络实例(一)

    跟着这位博主来学习C++的卷积网络实例,因为作者一直在更新代码,所以新的代码和这位博主的分析有所不同:这位博主写的东西太泛了,没有讲到实质, 可以参考下他分析的类与类之间的关系图.. 前四节:http ...

  5. C语言实现knn

    以后写代码一定要谨慎,提高代码的正确率. /*************************************** * 1.初始化距离为最大值 * 2.计算未知样本和每个训练样本的距离为dis ...

  6. NSBundle pathForResource is NULL 取不到值

    错误提示: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL i ...

  7. 【hdoj_1715】大菲波数(大数+100000000进制)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1715 本题采用大数加法即可解决.采用100000000进制速度更快. C++代码如下: #include& ...

  8. svm 中采用自动搜索参数的方式获得参数值

    载时自http://blog.csdn.net/u011177305/article/details/46458801?locationNum=1 OpenCV中SVM类是提供了优化参数值功能的,下面 ...

  9. bzoj 2326 矩阵快速幂

    思路:矩阵快速幂搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second # ...

  10. bzoj 1818 主席树

    思路:主席树搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...