【问题标题】:How do I use converters in Xamarin.Forms to convert text to color?如何在 Xamarin.Forms 中使用转换器将文本转换为颜色?
【发布时间】:2017-11-02 11:47:03
【问题描述】:

我想对我的应用程序颜色进行固定枚举,即文本颜色、分隔符颜色和背景颜色,我不想每次使用时都输入相同的颜色,所以我想我可以传递对象名称(例如分隔符),然后在转换器中将其转换为所需的颜色: 这是我对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();
    }
}

但是据我所知,我将它用于数据绑定,但我只是想将一个字符串传递给颜色属性,并由转换器处理它,我添加了一个 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}"/>

【问题讨论】:

  • 在 ConvertBack() 中添加 return value;
  • 查看我的编辑以了解正确的绑定语法
  • @ZiyadGodil - ConvertBack 仅在使用 双向绑定 时需要。也就是说,如果他还需要将 Color 对象转换回十六进制字符串。做有问题的描述,这是不需要的。更重要的是,如果需要双向绑定,你肯定不做 return value;那甚至不是预期的类型。如果 Convert 执行 string =&gt; Color,则 ConvertBack 将执行 Color =&gt; string

标签: c# xaml xamarin.forms ivalueconverter


【解决方案1】:

您还可以将颜色值存储在 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'}" />

在您的值转换器中,使用参数对象而不是值对象 - 我们在此示例中将“分隔符”作为参数传递。但是,我不推荐这种方法。

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

我认为 Diego 仅使用样式的想法是可行的方法,但这回答了您的问题并在我的测试中有效。

【讨论】:

    【解决方案2】:

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

    这里是你必须如何设置转换器的使用:

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

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

    【讨论】:

    • 我同意使用样式是这里的方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2014-02-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多