使用Xamarin Forms,在App.xaml内的x:Key =内使用x:Static不起作用

时间:2018-08-20 22:44:23

标签: c# xamarin xamarin.forms mvvmcross

因此,我正在编写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>

0 个答案:

没有答案