使用并更新动态资源
上一单元中,你在 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 值。