zoukankan      html  css  js  c++  java
  • [WPF系列]-DynamicResource与StaticResource的区别

    探讨:
    1、当引用资源时,选择StaticResource还是DynamicResource的考虑因素:
    (1)在哪里创建资源?(资源的范围或层级
    a. 资源是在一个Page/Canvas/Window中?
    b. 在应用程序范围中?
    c. 在松散的Xaml中?
    d. 在某个特定的Object(比如某个特定的Button)中?
    物件级:此时,资源只能套用在这个Object物件,或套用至该物件的子物件。
    文件级:如果将资源定义在Window或Page层级的XAML档中,那么可以套用到这个文件中的所有物件。
    应用程序级:如果我们将资源定义在App.xaml 中,那么,就可以将资源套用到应用程序内的任何地方。
    字典级:当我们把资源封装成一个资源字典, 定义到一个ResourceDictionary的XAML文件时,就可以在另一个应用程序中重复使用。

    (2) 应用程序的功能:是否在运行时改变资源?
    如果需要改变,则使用DynamicResource。
    (3) 每个资源引用类型不同的寻找行为。(需要支持向前引用吗?)
    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)希望资源可以向前引用时(如上面在Canvas中引用innerLgbResource一样)
    (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)查找系统资源。

    参考

    用实例讲DynamicResource与StaticResource的区别

  • 相关阅读:
    三分钟学会funsioncharts
    funsioncharts的图表操作heatmap
    FunsionCharts图标控件点击
    微信小程序组件解读和分析:二、scrollview可滚动视图区域 微信开发
    微信小程序组件解读和分析:五、text文本 微信开发
    微信小程序组件解读和分析:三、swiper滑块视图 微信开发
    微信小程序组件解读和分析:四、icon图标 微信开发
    asp.net 判断上传文件的类型
    C#序列化(Serialize)、反序列化(Deserialize)
    [置顶] http://www.openlib.com 一个神奇的网站
  • 原文地址:https://www.cnblogs.com/HQFZ/p/4205830.html
Copyright © 2011-2022 走看看