因此,我正在编写Xamarin Forms应用程序,并且试图消除整个应用程序中的所有魔术字符串。似乎总是以硬编码字符串结尾的地方之一是App.Xaml文件,尤其是其中放置的所有内容的x:Key属性。
例如,对于条目:<Color x:Key="GrayColor">#8f8e8e</Color>
,字符串“ GrayColor”是硬编码的,然后无论在何处都必须准确键入。
我的想法是创建一个全局Constants类,并将键存储在其中。像这样:
public static class Constants
{
public const string GrayColor = "GrayColor";
}
当在BackgroundColor = (Color)Application.Current.Resources[Constants.GrayColor]
之类的对象的代码中以及在TextColor="{StaticResource Key={x:Static helpers:Constants.GrayColor}}"
之类的视图的Xaml中设置属性时,此方法可用于访问颜色。
但是,当我尝试使用<Color x:Key="{x:Static helpers:Constants.GrayColor}">#8f8e8e</Color>
更新App.Xaml条目时,启动应用程序后我会收到错误System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidCastException: Specified cast is not valid.
。
我已经四处摸索了,我不知道是否支持在x:Key中使用x:Static。有人可以指出正确的方向吗?我的完整代码如下所示:
App.Xaml类:
<Application x:Class="Test.Shared.App"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:helpers="clr-namespace:Test.Shared.Helpers"
xmlns:mvx="clr-namespace:MvvmCross.Forms.Bindings;assembly=MvvmCross.Forms">
<Application.Resources>
<ResourceDictionary>
<Color x:Key="{x:Static helpers:Constants.GrayColor}">#8f8e8e</Color>
</ResourceDictionary>
</Application.Resources>
Constants类:
namespace Test.Shared.Helpers
{
/// <summary>
/// Contains constants that are used throughout the app.
/// </summary>
public static class Constants
{
public const string GrayColor = "GrayColor";
}
}
以及使用它的视图:
<?xml version="1.0" encoding="UTF-8" ?>
<Grid x:Class="Test.Shared.Controls.CustomView"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:helpers="clr-namespace:Test.Shared.Helpers"
x:Name="This">
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".15*" />
<ColumnDefinition Width=".7*" />
<ColumnDefinition Width=".15*" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Row="0"
Grid.Column="1"
HorizontalOptions="CenterAndExpand"
Spacing="15"
VerticalOptions="CenterAndExpand">
<Image Source="{Binding Source={x:Reference This}, Path=DisplayImageSource}" />
<Label FontSize="14.5"
HorizontalTextAlignment="Center"
Text="{Binding Source={x:Reference This}, Path=DisplayText}"
TextColor="{StaticResource Key={x:Static helpers:Constants.GrayColor}}" />
</StackLayout>