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

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

(一)基础知识html

静态资源(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.”post

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

(二) 运用场合this

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

因为依赖属性具备属性系统提供的值缓存机制,因此,若是能在程序装载时设置依赖属性的值,这样,依赖属性就不须要检查本身的值并返回最后的有效值了。操作系统

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

(三)查询方式code

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)",上面面程序中字符串就是利用这种方法。

相关文章
相关标签/搜索