xamarin中xaml 定义和使用资源

使用 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");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值