使用并更新动态资源

已完成

上一单元中,你在 XAML 中定义了资源,并将其用作静态值。 但是,有时 StaticResource 并不适用。 请考虑下列情形:

  • 假设你要实现能够使用户在运行时更改应用外观的颜色主题。 StaticResource 标记扩展仅执行字典查找操作一次,因此无法动态更新 UI。

  • 可将用户首选项存储在 Web 服务器上,并在应用程序启动时加载它们。 如果在字典中找不到密钥,StaticResource 标记扩展会引发异常。

本单元介绍如何使用动态资源来处理此类问题。

如何在运行时更新资源

请将资源存储在资源字典中。 可以编写可在运行时更新这些资源的代码。 甚至可以添加新资源或删除现有资源。

请看下面的示例:

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

假设要在应用程序运行时更改 PanelBackgroundColor 资源的值。 可将代码添加到页面的代码隐藏文件中,以访问 Resources 属性。 以下示例将上一 XAML 示例中的资源值更新为另一颜色。

this.Resources["PanelBackgroundColor"] = Colors.Green;

什么是 DynamicResource?

DynamicResource 是另一个用于查找资源字典中的资源的标记扩展。 它与 StaticResource 类似,因为它会在目标对象创建后执行字典查找操作。 但它还会侦听字典中对资源所做的更改。 如果字典中的资源值发生了更改,DynamicResource 会自动更新 UI。

DynamicResource 比 StaticResource 有优势。 如果 DynamicResource 在字典中找不到键,它会让属性保持未设置状态。 与 StaticResource 不同,缺失键不是错误,不会引发异常。

注意

DynamicResource 标记扩展的性质会对应用程序施加较小的性能惩罚。 虽然可以在 XAML 页面中使用 DynamicResource 代替 StaticResource,但如果资源未更改,则应通过 StaticResource 标记扩展来引用它。

若要使用前面示例中更新的背景色,可以在 XAML 代码中应用 DynamicResource,如下所示:

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

如果 PanelBackgroundColor 资源的值发生更改,系统会自动更新 StackLayout 控件的 BackgroundColor 值。

知识检查

1.

什么功能是 DynamicResource 提供而 StaticResource 不提供的?