作为一名Android开发人员,我曾经使用过Android XML中的@dimen/
-constant。我发现这个未来很有用,因为它使我可以轻松地更改应该具有相同像素长度的多个位置。
Xamarin.Forms具有我可以使用的类似功能吗?
答案 0 :(得分:4)
您正在寻找ResourceDictionaries
XAML资源是可以在Xamarin.Forms应用程序中共享和重复使用的对象的定义。 这些资源对象存储在资源字典中。
ResourceDictionary
是Xamarin.Forms应用程序使用的资源的存储库。存储在ResourceDictionary中的典型资源包括样式,控制模板,数据模板,颜色和转换器。
在XAML中,然后可以使用ResourceDictionary
标记扩展来检索存储在StaticResource
中的资源并将其应用于元素。在C#
中,也可以在ResourceDictionary
中定义资源,然后使用基于字符串的索引器来检索资源并将其应用于元素。但是,在ResourceDictionary
中使用C#
并没有什么好处,因为共享对象可以简单地存储为fields
或properties
并直接访问而不必先从中检索它们dictionary
。
创建和使用ResourceDictionary
Resources
在ResourceDictionary
中定义,然后将其设置为以下“资源”属性之一:
Xamarin.Forms
程序仅包含一个从Application
派生的类,但经常使用许多从VisualElement
派生的类,包括页面,布局和控件。这些对象中的任何一个都可以将其Resources属性设置为ResourceDictionary
。选择在何处放置特定的ResourceDictionary
会影响可使用资源的位置:
附加到诸如ResourceDictionary
或Button
之类的视图的Label
中的资源只能应用于该特定对象,因此不是很有用。 / p>
Resources
或ResourceDictionary
等布局的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代码中。