Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Xamarin.Forms中使用转换器将文本转换为颜色?_C#_Xaml_Xamarin.forms_Ivalueconverter - Fatal编程技术网

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

C# 如何在Xamarin.Forms中使用转换器将文本转换为颜色?,c#,xaml,xamarin.forms,ivalueconverter,C#,Xaml,Xamarin.forms,Ivalueconverter,我希望我的应用程序颜色的固定枚举,即文本颜色、分隔符颜色和背景颜色,我不希望每次使用时都键入相同的颜色,因此我认为可以传递对象名称(例如分隔符),并在转换器中将其转换为所需的颜色: 下面是我对IValueConverter类的实现: class AppColorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo cu

我希望我的应用程序颜色的固定枚举,即文本颜色、分隔符颜色和背景颜色,我不希望每次使用时都键入相同的颜色,因此我认为可以传递对象名称(例如分隔符),并在转换器中将其转换为所需的颜色: 下面是我对
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}"/>

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

以下是您必须如何设置转换器的使用:

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


尽管如此,在您的场景中,您不认为样式是更好的方法吗?

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

<Color x:Key="ThemeBlue">#2499CE</Color>
这样,您就可以在站点上的所有转换器中重用颜色值,并在ResourceDictionary的一个地方管理它们

编辑

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

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

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

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

在ConvertBack()中添加
返回值;
有关正确的绑定,请参见我的编辑syntax@ZiyadGodil-ConvertBack仅在使用双向绑定时才需要。也就是说,如果他还需要将颜色对象转换回十六进制字符串。要执行上述操作,不需要这样做。更重要的是,如果需要双向绑定,您肯定不会执行
返回值
;that甚至不是期望的类型。如果Convert执行
string=>Color
,那么ConvertBack将执行
Color=>string
。我同意使用样式是一种方法。
<Label Text="English" VerticalOptions="CenterAndExpand" HorizontalOptions="EndAndExpand" TextColor="{Binding ., Converter={StaticResource colorConverter}, ConverterParameter='separator'}" />
if (parameter is string)
        {
            var color = (string)parameter;
            ... etc ...