如何从字符串常量

时间:2018-02-03 19:18:15

标签: c# xaml xamarin.forms

我有一个静态类,其中包含静态定义的HEX颜色值:

namespace Namespace1
{
    public static class MyColors
    {
        public const string COLOR_1 = "#AABBCC";
        // ...
    }
}

我希望在资源字典中定义所有这些颜色,以便它们可以在XAML中使用:

<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="Namespace2.Style.Colors"
    xmlns:n1="clr-namespace:Namespace1;assembly=Assembly1">
    <Color x:Key="Color1" x:FactoryMethod="FromHex">
        <x:Arguments>
            <x:String>{x:Static n1:MyColors.COLOR_1}</x:String>
        </x:Arguments>
    </Color>
    <!-- ... -->
</ResourceDictionary>

但这似乎不起作用。没有编译错误,但颜色本身为空(透明)。

如果我将{x:Static n1:MyColors.COLOR_1}部分替换为实际的#AABBCC值,那么它就能正常工作。

我还测试了{x:Static n1:MyColors.COLOR_1}部分(使用Label和Text属性)并且它可以正常工作。

那么这里有什么问题?这似乎是一个内部的Xamarin.Forms错误。

4 个答案:

答案 0 :(得分:1)

问题本身并未解决,但找到了我试图实现的解决方案:

因此,不是在Colors.xaml文件中声明颜色,而是可以使用Colors.xaml.cs方法在Add文件中声明它们:

namespace Namespace2.Style
{
    public partial class Colors : ResourceDictionary
    {
        public Colors()
        {
            InitializeComponent();

            Add("Color1", Color.FromHex(MyColors.COLOR_1));
            // ...
        }
    }
}

答案 1 :(得分:1)

好吧,忘了类型转换器。我得到了这样的工作:

<SolidColorBrush x:Key="Color1" Color="{Binding Source={x:Static n1:MyColors.COLOR_1}}" />

这是你的另类选择吗?

答案 2 :(得分:0)

如果您有时间使用类型转换器测试解决方案:

namespace Namespace1
{
    using System.ComponentModel;
    using System.Windows.Media;

    public static class MyColors
    {
        [TypeConverter(typeof(ColorConverter))]
        public static string COLOR_1 { get; } = "#AABBCC";
    }
}

答案 3 :(得分:0)

名为namespace MyNamespace { public static class MyColors { public const string Blue = "#AABBCC"; } public static class MyColor { public static Color MyBlue { get { return Color.FromHex(MyColors.Blue); } } } } 的程序集中的类:

xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:c="clr-namespace:MyNamespace;assembly=MyAssembly"
...
<Label Text="MyColor.MyBlue example" TextColor="{x:Static c:MyColor.MyBlue}"/>

XAML:

c

请注意,myColor命名空间可能会被命名为例如myColor:MyColor.MyBlue以便更好地识别它。标签中的符号将为HWND