如何使用 Xamarin.Forms 中的转换器将文本转换为颜色?
How do I use converters in Xamarin.Forms to convert text to color?
我想要我的应用程序颜色的固定枚举,即文本颜色、分隔符颜色和背景颜色,我不想每次使用它时都输入相同的颜色,所以我认为我可以传递对象名称(例如分隔符),然后在转换器中将其转换为所需的颜色:
这是我对 IValueConverter
class:
的实现
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}"/>
只是你忘记了一个细节:使用转换器的静态资源声明。
以下是您必须如何设置转换器的使用:
<Label Text="English"
VerticalOptions="CenterAndExpand"
HorizontalOptions="EndAndExpand"
TextColor="{separator, Converter={StaticResource colorConverter}}"/>
尽管如此,在您的场景中,您不认为样式是更好的方法吗?
您还可以将颜色值存储在 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'}" />
并且在您的值转换器中,使用参数对象而不是值对象 - 我们在此示例中将 "separator" 作为参数传递。但是,我不推荐这种方法。
if (parameter is string)
{
var color = (string)parameter;
... etc ...
我认为 Diego 仅使用样式的想法是可行的方法,但这回答了您的问题并在我的测试中起作用。
基本上您不能使用该语法 {separator, Converter=colorConverter}
,因为大括号表示您正在使用标记扩展(在这种情况下,这意味着您的代码库中某处有一个继承自 MarkupExtension 的 separatorExtension ,它有一个名为 Converter 的 属性,但这也不起作用,因为 UWP 不支持自定义标记扩展)。如果您尝试使用绑定标记扩展(及其转换器,它应该是这样的 {Binding separator, C....
),您也不能这样做,因为它会尝试搜索 'separator' 属性 在包含元素的 DataContext 中(但在 WPF 中,您可以绑定到静态 属性,因此您可以在 XAML 中的某处创建字符串实例并静态绑定到它以通过转换器使用。我们无法在 UWP 中实现这一点)。因此,您唯一的选择是使用 David 的回答中的资源方法,并通过 {StaticResource MyColor}
语法引用它们。
我想要我的应用程序颜色的固定枚举,即文本颜色、分隔符颜色和背景颜色,我不想每次使用它时都输入相同的颜色,所以我认为我可以传递对象名称(例如分隔符),然后在转换器中将其转换为所需的颜色:
这是我对 IValueConverter
class:
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}"/>
只是你忘记了一个细节:使用转换器的静态资源声明。
以下是您必须如何设置转换器的使用:
<Label Text="English"
VerticalOptions="CenterAndExpand"
HorizontalOptions="EndAndExpand"
TextColor="{separator, Converter={StaticResource colorConverter}}"/>
尽管如此,在您的场景中,您不认为样式是更好的方法吗?
您还可以将颜色值存储在 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'}" />
并且在您的值转换器中,使用参数对象而不是值对象 - 我们在此示例中将 "separator" 作为参数传递。但是,我不推荐这种方法。
if (parameter is string)
{
var color = (string)parameter;
... etc ...
我认为 Diego 仅使用样式的想法是可行的方法,但这回答了您的问题并在我的测试中起作用。
基本上您不能使用该语法 {separator, Converter=colorConverter}
,因为大括号表示您正在使用标记扩展(在这种情况下,这意味着您的代码库中某处有一个继承自 MarkupExtension 的 separatorExtension ,它有一个名为 Converter 的 属性,但这也不起作用,因为 UWP 不支持自定义标记扩展)。如果您尝试使用绑定标记扩展(及其转换器,它应该是这样的 {Binding separator, C....
),您也不能这样做,因为它会尝试搜索 'separator' 属性 在包含元素的 DataContext 中(但在 WPF 中,您可以绑定到静态 属性,因此您可以在 XAML 中的某处创建字符串实例并静态绑定到它以通过转换器使用。我们无法在 UWP 中实现这一点)。因此,您唯一的选择是使用 David 的回答中的资源方法,并通过 {StaticResource MyColor}
语法引用它们。