如何创建要在Xamarin.Forms XML中使用的常量

时间:2018-11-27 13:41:27

标签: xaml xamarin xamarin.forms

作为一名Android开发人员,我曾经使用过Android XML中的@dimen/-constant。我发现这个未来很有用,因为它使我可以轻松地更改应该具有相同像素长度的多个位置。

Xamarin.Forms具有我可以使用的类似功能吗?

3 个答案:

答案 0 :(得分:4)

您正在寻找ResourceDictionaries

  

XAML资源是可以在Xamarin.Forms应用程序中共享和重复使用的对象的定义。   这些资源对象存储在资源字典中。

ResourceDictionary是Xamarin.Forms应用程序使用的资源的存储库。存储在ResourceDictionary中的典型资源包括样式,控制模板,数据模板,颜色和转换器。

在XAML中,然后可以使用ResourceDictionary标记扩展来检索存储在StaticResource中的资源并将其应用于元素。在C#中,也可以在ResourceDictionary中定义资源,然后使用基于字符串的索引器来检索资源并将其应用于元素。但是,在ResourceDictionary中使用C#并没有什么好处,因为共享对象可以简单地存储为fieldsproperties并直接访问而不必先从中检索它们dictionary

创建和使用ResourceDictionary

ResourcesResourceDictionary中定义,然后将其设置为以下“资源”属性之一:

  • 从Application派生的任何类的Resources属性。
  • 从VisualElement派生的任何类的Resources属性

Xamarin.Forms程序仅包含一个从Application派生的类,但经常使用许多从VisualElement派生的类,包括页面,布局和控件。这些对象中的任何一个都可以将其Resources属性设置为ResourceDictionary。选择在何处放置特定的ResourceDictionary会影响可使用资源的位置:

  • 附加到诸如ResourceDictionaryButton之类的视图的Label中的资源只能应用于该特定对象,因此不是很有用。 / p>

  • 附加到ResourcesResourceDictionary等布局的StackLayout中的
  • Grid可以应用于该布局以及该布局的所有子级。 / p>

  • 在页面级别定义的ResourceDictionary中的
  • 资源可以应用于页面及其所有子页面。

  • 在应用程序级别定义的ResourceDictionary中的资源可以在整个应用程序中应用。

以下XAML显示了作为标准Xamarin.Forms程序的一部分创建的ResourceDictionary文件中在应用程序级别App.xaml中定义的资源:

<Application ...>
<Application.Resources>
    <ResourceDictionary>
        <Color x:Key="PageBackgroundColor">Yellow</Color>
        <Color x:Key="HeadingTextColor">Black</Color>
        <Color x:Key="NormalTextColor">Blue</Color>
        <Style x:Key="LabelPageHeadingStyle" TargetType="Label">
            <Setter Property="FontAttributes" Value="Bold" />
            <Setter Property="HorizontalOptions" Value="Center" />
            <Setter Property="TextColor" Value="{StaticResource HeadingTextColor}" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

Xamarin.Forms 3.0开始,不需要显式ResourceDictionary标签。 ResourceDictionary对象是自动创建的,您可以直接在Resources属性元素标记之间插入资源:

<Application ...>
<Application.Resources>
    <Color x:Key="PageBackgroundColor">Yellow</Color>
    <Color x:Key="HeadingTextColor">Black</Color>
    <Color x:Key="NormalTextColor">Blue</Color>
    <Style x:Key="LabelPageHeadingStyle" TargetType="Label">
        <Setter Property="FontAttributes" Value="Bold" />
        <Setter Property="HorizontalOptions" Value="Center" />
        <Setter Property="TextColor" Value="{StaticResource HeadingTextColor}" />
    </Style>
</Application.Resources>

每个资源都有一个使用x:Key属性指定的键,该属性在ResourceDictionary中成为字典键。该密钥用于通过ResourceDictionary标记扩展从StaticResource检索资源,如以下XAML代码示例所示,该示例显示了在StackLayout中定义的其他资源:

<StackLayout Margin="0,20,0,0">
<StackLayout.Resources>
<ResourceDictionary>
  <Style x:Key="LabelNormalStyle" TargetType="Label">
    <Setter Property="TextColor" Value="{StaticResource NormalTextColor}" />
  </Style>
  <Style x:Key="MediumBoldText" TargetType="Button">
    <Setter Property="FontSize" Value="Medium" />
    <Setter Property="FontAttributes" Value="Bold" />
  </Style>
 </ResourceDictionary>
 </StackLayout.Resources>
 <Label Text="ResourceDictionary Demo" Style="{StaticResource LabelPageHeadingStyle}" />
<Label Text="This app demonstrates consuming resources that have been defined in resource dictionaries."
       Margin="10,20,10,0"
       Style="{StaticResource LabelNormalStyle}" />
<Button Text="Navigate"
        Clicked="OnNavigateButtonClicked"
        TextColor="{StaticResource NormalTextColor}"
        Margin="0,20,0,0"
        HorizontalOptions="Center"
        Style="{StaticResource MediumBoldText}" />
</StackLayout>

有关更多详细信息,请查看here

答案 1 :(得分:1)

对我来说就像您想在ResourceDictionary中定义常量/样式一样:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/resource-dictionaries

在ResourceDictionary中,您可以通过键定义常量/样式,然后在XAML中,可以按以下方式引用它们:

  Color={StaticResource MyColorFromDictionary}

希望这会有所帮助!

答案 2 :(得分:0)

除了上面提到的StaticResource之外,还有另外两种实现方法。

第一个是,具有用于常量的静态类,并在XAML中引用它们。

public static class GlobalSetting
{
    public static double ImageRotation { get { return 180; } }
}

在Xaml中,您需要在page指令中添加此命名空间,

xmlns:gb="clr-namespace:XXXX.StaticData"

并在xaml代码中使用以下常量,

<Image Source="icon_back.png" Rotation="{x:Static gb:GlobalSetting.BackImageRotation}" HeightRequest="24" </Image>

第二种方法是,在BaseViewModel中具有一个常量参数,并将其绑定到Xaml代码中。