WPF中StaticResource 标记扩展和DynamicResource 标记扩展

StaticResource标记扩展 通过在所有可用的资源字典中查找键的值来处理该键。 这发生在加载过程中,即加载过程需要分配采用静态资源引用的属性值时。
DynamicResource标记扩展 则通过创建一个表达式来处理键。该表达式直到实际运行应用程序时才进行求值并提供值。

引用资源时,以下事项会影响是使用静态资源引用还是动态资源引用:

如何为应用程序创建资源的总体设计(按页、在应用程序中、在松散的 XAML 中、在纯资源程序集中)。

应用程序功能:实时更新资源是否是应用程序要求的一部分?

该资源引用类型的相应查找行为。

特定属性或资源类型,以及这些类型的本机行为。

 

静态资源

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

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

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

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

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

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

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

 

动态资源

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

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

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

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

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

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

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

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


### 回答1: DynamicResourceStaticResourceWPF的两种资源引用方式。 StaticResource是静态资源引用方式,一旦被引用,其值就不再改变。StaticResource可以用于所有可用的资源类型,包括Brush、Style、DataTemplate等。 DynamicResource是动态资源引用方式,其值可以随时改变,而不需要重新加载应用程序。DynamicResource通常用于依赖于某些外部条件而变化的资源,例如主题、语言、字体大小等。 使用这两种资源引用方式的语法类似,只需要使用不同的关键字即可。例如,使用StaticResource引用资源的语法为{StaticResource ResourceKey},而使用DynamicResource引用资源的语法为{DynamicResource ResourceKey}。 ### 回答2: DynamicResourceStaticResourceWPF(Windows Presentation Foundation两种不同的资源引用方式。 StaticResource 是一种静态资源引用方式,它在应用程序启动时就会加载并解析资源,然后将其绑定到相应的控件上。在运行时,如果该资源发生了修改,它不会自动更新,只能手动重新加载。 DynamicResource 是一种动态资源引用方式,它在应用程序运行时才会加载并解析资源。与 StaticResource 不同的是,DynamicResource 在运行时会保持对资源的动态引用,使得如果该资源发生了修改,它能够自动更新并重新加载。这使得 DynamicResource 可以实现动态的样式变化、主题切换等效果。 通过动态资源引用,我们可以实现更加灵活的界面设计。比如,当我们希望在不同主题下切换应用程序的样式时,可以使用 DynamicResource 引用不同的样式资源,而无需修改控件的代码逻辑。只需修改主题资源文件,并让应用程序重新加载资源,就能够实现主题的切换。 需要注意的是,DynamicResource 的解析效率相对较低,因为它需要在运行时进行解析和重新加载资源。而 StaticResource 的解析效率较高,因为它在应用程序启动时就已经加载并解析了资源。因此,在性能要求较高的情况下,应该优先考虑使用 StaticResource。 ### 回答3: DynamicResourceStaticResource是用于在WPF应用程序引用资源的两个不同的方式。 StaticResource是在XAML使用的一种静态引用资源的方法。当使用StaticResource引用资源时,资源会在应用程序启动时被解析和加载,并且在运行时不会发生改变。这意味着无论资源的值如何改变,使用StaticResource引用的控件都将保持初始的资源值。StaticResource适用于那些不需要在运行时更改的资源。 DynamicResource则是一种动态引用资源的方式。与StaticResource不同,DynamicResource引用的资源在运行时可以随时更改,因此控件会自动更新以反映最新的资源值。这使得DynamicResource适用于那些可能需要根据用户输入或应用程序状态更改的资源。由于DynamicResource是动态解析资源,因此它的性能可能会稍微差一些。 在使用DynamicResourceStaticResource时需要注意,由于DynamicResource是在运行时解析,因此它不能在某些场景下使用,例如在控件的样式或构造函数。另外,DynamicResource只能用于依赖属性,而不能用于CLR属性。 总的来说,DynamicResourceStaticResource提供了在WPF应用程序引用资源的不同方式,StaticResource适用于那些不需要在运行时更改的资源,而DynamicResource则适用于那些可能需要随时更新的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值