使用 StaticResource 应用资源
StaticResource 是一个标记扩展,用于在资源字典中查找资源。 提供资源的键后,标记扩展会返回相应的值。
让我们看看它的工作原理。 目标是创建 Color 资源,然后使用它来设置 TextColor 属性。 可以在字典中定义颜色,然后使用标记扩展来检索值。
<Page.Resources>
<Color x:Key="PageControlTextColor">Blue</Color>
</Page.Resources>
...
<Label TextColor="{StaticResource PageControlTextColor}" ... />
我们将它称之为 StaticResource,因为该扩展只得到一次评估。 创建目标对象时进行字典查找。 如果字典中的资源值更改,则不会更新目标属性。
ps:如果找不到键,则 StaticResource 会引发运行时异常。
XAML 内部类型
XAML 规范为我们提供了许多 C# 基元类型的类型名称。 以下代码显示了每种内部类型的示例资源。
<Page.Resources>
<x:String x:Key="...">Hello</x:String>
<x:Char x:Key="...">X</x:Char>
<x:Single x:Key="...">31.4</x:Single>
<x:Double x:Key="...">27.1</x:Double>
<x:Byte x:Key="...">8</x:Byte>
<x:Int16 x:Key="...">16</x:Int16>
<x:Int32 x:Key="...">32</x:Int32>
<x:Int64 x:Key="...">64</x:Int64>
<x:Decimal x:Key="...">12345</x:Decimal>
<x:TimeSpan x:Key="...">1.23:5959</x:TimeSpan>
<x:Boolean x:Key="...">True</x:Boolean>
</Page.Resources>
OnPlatform 作为资源
在各个平台之间,通常需要简单调整应用的 UI。 要定义特定于平台的值,标准方法是使用 OnPlatform 对象。
由于 ResourceDictionary 会将字符串映射到对象,因此可以将 OnPlatform 实例放入字典中。 例如,以下代码演示了如何在 iOS 和 Android 上使用不同的文本颜色。
<Page.Resources>
<OnPlatform x:Key="textColor"
x:TypeArguments="Color"
iOS="Silver"
Android="Green" />
</Page.Resources>
...
<Label TextColor="{StaticResource textColor}" ... />
如何在运行时更新资源
<Page.Resources>
<Color x:Key="PanelBackgroundColor">Blue</Color>
</Page.Resources>
假设要在应用程序运行时更改 PanelBackgroundColor 资源的值。 将在页面的代码隐藏文件中编写代码以访问 Resources 属性。 以下示例介绍如何将资源值更新为其他颜色。
this.Resources["PanelBackgroundColor"] = Color.Green;
DynamicResource
DynamicResource 是一个标记扩展,用于在资源字典中查找资源。 它与 StaticResource 类似,因为它在创建目标对象时执行字典查找。 但它还会侦听字典中对资源所做的更改。 如果字典中的资源值发生了更改,DynamicResource 将自动更新 UI。
相较于 StaticResource,DynamicResource 还有另外一个优点。 如果 DynamicResource 在字典中找不到键,它将使属性保持为未设置状态。 与 StaticResource 不同,缺失键不是错误,也不会引发异常。
假设你想使用前面示例中更新后的背景色。 定义将与此 XAML 类似:
<ContentPage ...>
<Page.Resources>
<Color x:Key="PanelBackgroundColor">Blue</Color>
</Page.Resources>
<StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
...
</StackLayout>
</ContentPage>
运行时更新资源DynamicResource
Resources["fgColor"] = Color.FromHex("#606060");
Resources["bgColor"] = Color.FromHex("#C0C0C0");