• 星空雅梦


    WPF教程(五)资源(StaticResource 静态资源、DynamicResource 动态资源)

    (一)基础知识

    静态资源(Static Resource),动态资源(Dynamic Resources)。这两者的区别是:静态资源在第一次编译后即确定其对象或值,之后不能对其进行修改。动态资源则是在运行时决定,当运行过程中真正需要时,才到资源目标中查找其值。因此,我们可以动态地修改它。由于动态资源的运行时才能确定其值,因此效率比静态资源要低。

    动态修改,是两种资源最显著的差异,也是极其重要的知识点,下面这个例子就是最好的说明,简单但能解决问题。

    1.  
      <Window x:Class="StaticDynamicResources.MainWindow"
    2.  
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3.  
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4.  
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
    5.  
      Title="MainWindow" Height="350" Width="525">
    6.  
      <Window.Resources>
    7.  
      <sys:String x:Key="Content" >
    8.  
      Hello World!
    9.  
      </sys:String>
    10.  
      </Window.Resources>
    11.  
      <Grid>
    12.  
      <WrapPanel>
    13.  
      <TextBlock Text="静态"/>
    14.  
      <TextBox Text="{StaticResource Content}" Width="100" x:Name="TextBox1"/>
    15.  
      <TextBlock Text="动态" Margin="10,0,0,0"/>
    16.  
      <TextBox Text="{DynamicResource Content}" Width="100" x:Name="TextBox2"/>
    17.  
      <Button Content="改变资源值" Click="ChangeBtn_Click" Width="100"/>
    18.  
      </WrapPanel>
    19.  
      </Grid>
    20.  
      </Window>
    1.  
      private void ChangeBtn_Click(object sender, RoutedEventArgs e)
    2.  
      {
    3.  
      this.Resources["Content"] = "内容变了";
    4.  
      }

    我们点击Button发现,后面的TextBox值可以发生变化,因为它用是的动态资源。有趣的是,将上述程序Window.Resources放在获取资源后面,会出现错误将会收到错误提示:“StaticResource reference 'content' was not found.”

    出现此问题的原因是:StaticResource 查询行为不支持向后引用,即不能引用在引用点之后才定义的资源。而DynamicResource可以向后引用,即DynamicResource运行时才查找并加载所定义的资源。

    (二) 运用场合

    StaticResources的适用场合:
    (1)在资源第一次引用之后无需再修改资源的值。
    (2)资源引用不会基于运行时的行为进行重新计算,比如在重新加载Page/Window的时候。
    (3)当需要设置的属性不是DependencyObject或Freezable类型的时候,用StaticResource。
    (4)当需要将资源编译到dll中,并打包为程序的一部份,或者希望在各应用程序之间共享时,也使用StaticResource。
    (5)当需要为一个自定义控件创建一个Theme,并Theme中使用资源,就需要使用StaticResource。因为StaticResource的资源查找行为时可预测的,并且本身包含在Theme中。而对于DynamicResource,即使资源是定义在Theme中,也只能等到运行时确定,导致一些可能意料不到的情况发生。
    (6)当需要使用资源设置大量的依赖属性(Dependency Property)的时候。

    由于依赖属性具有属性系统提供的值缓存机制,所以,如果能在程序装载时设置依赖属性的值,这样,依赖属性就不需要检查自己的值并返回最后的有效值了。

     Dynamic Resource一般使用在如下场合:
    (1)资源的值依赖一些条件,而该条件直到运行时才能确定。
    包括系统资源,或是用户可设置的资源。比如:可以创建引用系统属性诸如SystemColors,SystemFonts来设置值,而这些属性是动态的,它们的值又来自于运行环境和操作系统。
    (2)为自定义控件引用或创建Theme Style。
    (3)希望在程序运行期间调整资源字典的内容时。
    (4)希望资源可以向前引用时(如上面在WrapPanel中引用content一样)
    (5)资源文件很大,希望在运行时才加载。
    (6)要创建的Style的值可能来自于其它值,而这些值又依赖于Theme或用户的设置。
    (7)当引用资源的元素的父元素有可能在运行期改变,这个时候也需要使用动态资源。因为父元素的改变将导致资源查询的范围。
    Dynamic resource的限制条件:属性必须是依赖属性,或是Freezable的。

    (三)查询方式

    Static Resource的查询方式
    (1)查找使用该资源的元素的Resource字典;
    (2)顺着逻辑树向上查找父元素的资源字典,直到根节点;
    (3)查找Application资源;
    (4)不支持向前引用,即:不能引用在引用点之后才定义的资源。

    Dynamic Resource的查询
    (1)查找使用该资源的元素的Resource字典;
    如果元素定义了一个Style 属性,将查找Style中的资源字典;如果元素定义了一个Template属性,将查找FrameworkTemplate中的资源字典。
    (2)顺逻辑树向上查找父元素的资源字典,直到根节点;
    (3)查找Application资源;
    (4)查找当前激活状态下的Theme资源字典;
    (5)查找系统资源。

    总结

    资源是保存在可执行文件中的一种不可执行数据。在WPF的资源中,几乎可以包含图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。

    也就是说,应用程序中非程序代码的内容,比如点阵图、颜色、字型、动画/影片档以及字符串常量值,可将它们从程序中独立出来,单独包装成"资源(Resource)",上面面程序中字符串就是利用这种方法。

  • 相关阅读:
    [整] Android Fragment 生命周期图
    LruCache--远程图片获取与本地缓存
    Android基于XMPP Smack openfire 开发的聊天室
    基于XMPP协议的Android即时通信系
    Android实现推送方式解决方案
    日历工具类(一)——公历农历互相转换
    IdHTTPServer使用注意问题
    用TIdIPWatch获取本地IP
    delphi TStringList 用法详解
    WIN7 64位配置X86 MySQL 数据源
  • 原文地址:https://www.cnblogs.com/LiZhongZhongY/p/10870413.html
Copyright © 2020-2023  润新知