如何在Xamarin.Forms中使用转换器将文本转换为颜色?

时间:2017-11-02 11:47:03

标签: c# xaml xamarin.forms ivalueconverter

我想修复我的app颜色的枚举,即文本的颜色,分隔符的颜色和背景的颜色,我不想每次使用时都输入相同的颜色,所以我想我可能传递对象名称(例如分隔符),并在转换器中将其转换为所需的颜色: 这是我对IValueConverter类的实现:

class AppColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string)
        {
            var color = (string)value;
            switch (color)
            {
                case "separator":
                    return Color.FromHex("c2bca8");
                case "text":
                    return Color.FromHex("96907e");
                default:
                    return Color.Default;
            }
        }
        else
            return null;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

但是我从数据绑定的知识中使用了这个,但我只想将一个字符串传递给color属性,并且转换器处理它,我添加了一个ResourceDictionary:

  <Controls:CustomPage.Resources>
        <ResourceDictionary>
            <Converters:AppColorConverter x:Key="colorConverter"/>
        </ResourceDictionary>
    </Controls:CustomPage.Resources>

但我如何使用它,这不起作用:

<Label Text="English" 
       VerticalOptions="CenterAndExpand" 
       HorizontalOptions="EndAndExpand" 
       TextColor="{separator, Converter=colorConverter}"/>

3 个答案:

答案 0 :(得分:4)

您还可以将颜色值存储在ResourceDictionary中,如下所示:

<Color x:Key="ThemeBlue">#2499CE</Color>

然后在switch语句中,使用以下语法:

return Application.Current.Resources["ThemeBlue"];

这样,您可以在网站上的所有转换器中重复使用颜色值,并在一个地方管理它们,即ResourceDictionary。

修改

您可以在尝试时进行绑定,但需要更新语法。试试这个:

<Label Text="English" VerticalOptions="CenterAndExpand" HorizontalOptions="EndAndExpand" TextColor="{Binding ., Converter={StaticResource colorConverter}, ConverterParameter='separator'}" />

在您的值转换器中,使用参数对象而不是值对象 - 我们正在传递&#34; separator&#34;作为此示例中的参数。但是,我不推荐这种方法。

if (parameter is string)
        {
            var color = (string)parameter;
            ... etc ...

我认为迭戈关于使用风格的想法是要走的路,但这可以回答你的问题并在我的测试中起作用。

答案 1 :(得分:2)

这只是您忘记的一个细节:使用转换器的静态资源声明。

以下是如何设置转换器的使用方法:

<Label Text="English" 
       VerticalOptions="CenterAndExpand" 
       HorizontalOptions="EndAndExpand" 
       TextColor="{separator, Converter={StaticResource colorConverter}}"/>

尽管如此,在你的场景中,你不认为这种风格是一种更好的方法吗?

答案 2 :(得分:2)

基本上你不能使用那种语法{separator, Converter=colorConverter},因为大括号表示你正在使用标记扩展(在这种情况下,它意味着你的代码库中某处继承了MarkupExtension的separatorExtension) ,它有一个名为Converter的属性,但由于UWP不支持自定义标记扩展,因此无法工作。如果你试图使用Binding标记扩展(使用它的转换器,它应该是这样的{Binding separator, C....),你不能这样做,因为它会尝试搜索&# 39;隔板&#39;包含元素的DataContext中的属性(但在WPF中,您可以绑定到静态属性,因此您可以在XAML中的某处创建字符串实例并静态绑定到它以通过转换器使用。我们不能在UWP中实现这一点。因此,您唯一的选择是采用资源方法,如David的答案,并通过{StaticResource MyColor}语法引用它们。