zoukankan      html  css  js  c++  java
  • wpf中StaticResource标记扩展和DynamicResource标记扩展的区别

    静态和动态资源

    资源可引用为静态资源或动态资源。 可通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展创建引用。 标记扩展是 XAML 的一项功能,可以通过使用标记扩展来处理属性字符串并将对象返回到 XAML 加载程序,从而指定对象引用。 有关标记扩展行为的详细信息,请参阅 标记扩展和 WPF XAML

    使用标记扩展时,通常会以字符串的形式提供一个或多个由该特定标记扩展处理的参数。 StaticResource 标记扩展通过在所有可用的资源字典中查找键值来处理键。 处理在加载期间进行,即加载过程需要分配属性值时。 DynamicResource 标记扩展则通过创建表达式来处理键,而且表达式会保持未计算状态,直至应用运行为止。当应用实际运行时,表达式会进行计算并提供一个值。

    在引用某个资源时,下列注意事项可能会对于使用静态资源引用还是使用动态资源引用产生影响:

    • 确定如何为应用创建资源的整体设计(在每页上、在应用程序中、在宽松的 XAML 中或在仅包含资源的程序集中)时,请考虑以下事项:

    • 应用的功能。 实时更新资源是否为应用要求的一部分?

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

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

    静态资源

    在以下情况下,最适合使用静态资源引用:

    • 应用设计将其大多数资源集中到页面或应用程序级资源字典中。 静态资源引用不基于运行时行为(例如重载页面)重新计算。 因此,根据资源和应用设计,如果避免不必要地使用大量动态资源引用,可能会一定程度地提高性能。

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

    • 要创建的资源字典将编译成 DLL,并将打包为应用的一部分或在应用间共享。

    • 要为自定义控件创建主题,并要定义在主题中使用的资源。 在这种情况下,通常不希望执行动态资源引用查找行为,而是希望执行静态资源引用行为,以确保查找可预测并自包含到主题中。 使用动态资源引用时,即使主题中的引用也会在运行时前保持未计算状态。 而且,主题可能会得到应用,但某个本地元素仍会重新定义主题正尝试引用的键,并且该本地元素在查找期间会排在主题之前。 如果发生这种情况,主题的行为将偏离预期方式。

    • 要使用资源设置大量依赖属性。 依赖属性会通过属性系统启用有效值缓存功能;因此,如果为可在加载时进行计算的依赖属性提供了值,则该依赖属性不必检查是否存在重新计算的表达式并可返回最后一个有效值。 此项技术可以提高性能。

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

    静态资源查找行为

    下面介绍属性或元素引用静态资源时自动发生的查找过程:

    1. 查找进程在用于设置属性的元素所定义的资源字典中查找请求的键。

    2. 查找过程随后会向上遍历逻辑树,以查找父元素及其资源字典。 此过程到达根元素后才会停止。

    3. 检查应用资源。 应用资源就是 Application 对象为 WPF 应用定义的资源字典中的资源。

    从资源字典中进行的静态资源引用必须引用已在资源引用前进行过词法定义的资源。 静态资源引用无法解析前向引用。 因此,请设计资源字典的结构,以便在每个相应资源字典的开头或邻近开头的位置定义资源。

    静态资源查找可以扩展到主题或系统资源中,但此查找受支持只是因为 XAML 加载程序推迟了请求。 为了让页面加载时的运行时主题正确地应用到应用,这种延迟是必需的。 但是,不建议使用对已知仅在主题中存在或作为系统资源存在的键的静态资源引用,因为如果用户实时更改主题,不会重新计算此类引用。 请求主题或系统资源时,动态资源引用更为可靠。 例外情况是当主题元素自身请求另一个资源。 出于上述原因,这些引用应该是静态资源引用。

    因找不到静态资源引用而引发的异常行为各不相同。 如果资源被延迟,则异常会在运行时发生。 如果资源未延迟,则异常会在加载时发生。

    动态资源

    在以下情况下,最适合使用动态资源:

    • 资源(包括系统资源或用户可设置的资源)的值取决于直到运行时才知道的条件。 例如,你可以创建 setter 值(引用由 SystemColorsSystemFonts 或 SystemParameters 公开的系统属性)。 这些值是真正的动态值,因为它们最终来自用户和操作系统的运行时环境。 或许还拥有可能会发生变化的应用程序级主题,而页面级资源访问也必须捕获其中的变化。

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

    • 打算在应用生存期内调整 ResourceDictionary 的内容。

    • 拥有存在相互依赖关系且可能需要进行前向引用的复杂资源结构。 静态资源引用不支持前向引用,但动态资源引用支持,因为资源在运行时之前不需要计算,所以前向引用是一个不相关的概念。

    • 要引用从编译或工作集的角度来看很大的资源,而且该资源在页面加载时可能不会立即使用。 页面加载时,始终会从 XAML 加载静态资源引用。 但是,动态资源引用在使用前不会加载。

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

    • 要将资源应用于可能会在应用生存期内在逻辑树中重定父级的元素。 父级更改后,资源查找范围也可能会随之更改;因此,如果希望重定父级的元素的资源基于新范围重新进行计算,请始终使用动态资源引用。

    动态资源查找行为

    如果调用 FindResource 或 SetResourceReference,则动态资源引用的资源查找行为会与代码中的查找行为并行执行:

    1. 查找在用于设置属性的元素所定义的资源字典中查找请求的键:

    2. 查找会向上遍历逻辑树,以查找父元素及其资源字典。 此过程到达根元素后才会停止。

    3. 检查应用资源。 应用资源就是 Application 对象为 WPF 应用定义的资源字典中的资源。

    4. 检查主题资源字典中当前处于活动状态的主题。 如果主题在运行时发生更改,则会重新计算值。

    5. 检查系统资源。

    异常行为(如果有)各不相同:

    • 如果 FindResource 调用请求了某个资源但未找到该资源,则会引发异常。

    • 如果 TryFindResource 调用请求了某个资源但未找到该资源,不会引发任何异常,并且返回的值为 null。 如果要设置的属性不接受 null,则仍有可能引发更深的异常(取决于要设置的单独属性)。

    • 如果 XAML 中的动态资源引用请求了某个资源但未找到该资源,则行为取决于常规属性系统。 常规行为即存在资源的级别上没有发生属性设置操作时执行的行为。 例如,如果尝试使用无法计算的资源来设置个别按钮元素上的背景,则值设置操作不会产生任何结果,但有效值可能仍来自属性系统和值优先级中的其他参与者。 例如,背景值可能仍来自在本地定义的某个按钮样式,或来自主题样式。 对于并非由主题样式定义的属性,资源计算失败后的有效值可能来自属性元数据中的默认值。

    限制

    动态资源引用存在一些重要限制。 必须至少满足以下条件之一:

    由于要设置的属性必须是 DependencyProperty 或 Freezable 属性,大多数属性更改都可以传播到 UI,这是因为属性更改(更改的动态资源值)会经由属性系统确认。 大多数控件都包含相应的逻辑;当 DependencyProperty 有所更改且该属性可能会影响布局时,该逻辑将强制使用控件的其他布局。 但是,并不保证所有使用 DynamicResource 标记扩展作为其值的属性都能在 UI 中提供实时更新。 此功能可能仍会因属性、属性所属的类型,甚至应用的逻辑结构而异。

  • 相关阅读:
    pyqt(一)安装及配置。
    systemctl centos fedora 用法
    onedriver -1T容量,edu邮箱申请。
    linux fdisk 添加硬盘,分区,挂载,永久挂载
    ssh的配置,ssh打开密钥登陆,关闭密码登陆。
    基金分仓
    基金交易席位的制度沿袭
    券商VIP交易通道
    解密中国证券金融股份有限公司
    光大“乌龙指”24小时
  • 原文地址:https://www.cnblogs.com/happyShare/p/13604382.html
Copyright © 2011-2022 走看看