为了使这个转换器通用,您可以使用ConverterParameter 来指定当value 为真或假时要插入的颜色。不透明度也可能是有趣的。我在这里提供了我采用参数 [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber] 的转换器。
由于@user1101511 提到的SolidColorBrush() 方法是System.Windows.Media 库的一部分,它使用来自同一库的Color 类型。这种类型没有Color.FromName() 方法,如System.Drawing.Color 类。
因此,我创建了一个名为 ColorFromName(string name) 的辅助方法。如果ConverterParameter 的交互失败,我将"LimeGreen" 指定为备用颜色。就我而言,当value 为假时,我希望输出为"Transparent"。
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
namespace MyConverters
{
[ValueConversion(typeof(bool), typeof(SolidColorBrush))]
class BoolToColorBrushConverter : IValueConverter
{
#region Implementation of IValueConverter
/// <summary>
///
/// </summary>
/// <param name="value">Bolean value controlling wether to apply color change</param>
/// <param name="targetType"></param>
/// <param name="parameter">A CSV string on the format [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber] may be provided for customization, default is [LimeGreen;Transperent;1.0].</param>
/// <param name="culture"></param>
/// <returns>A SolidColorBrush in the supplied or default colors depending on the state of value.</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush color;
// Setting default values
var colorIfTrue = Colors.LimeGreen;
var colorIfFalse = Colors.Transparent;
double opacity = 1;
// Parsing converter parameter
if (parameter != null)
{
// Parameter format: [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber]
var parameterstring = parameter.ToString();
if (!string.IsNullOrEmpty(parameterstring))
{
var parameters = parameterstring.Split(';');
var count = parameters.Length;
if (count > 0 && !string.IsNullOrEmpty(parameters[0]))
{
colorIfTrue = ColorFromName(parameters[0]);
}
if (count > 1 && !string.IsNullOrEmpty(parameters[1]))
{
colorIfFalse = ColorFromName(parameters[1]);
}
if (count > 2 && !string.IsNullOrEmpty(parameters[2]))
{
double dblTemp;
if (double.TryParse(parameters[2], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture.NumberFormat, out dblTemp))
opacity = dblTemp;
}
}
}
// Creating Color Brush
if ((bool) value)
{
color = new SolidColorBrush(colorIfTrue);
color.Opacity = opacity;
}
else
{
color = new SolidColorBrush(colorIfFalse);
color.Opacity = opacity;
}
return color;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
public static Color ColorFromName(string colorName)
{
System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName);
return Color.FromArgb(systemColor.A, systemColor.R, systemColor.G, systemColor.B);
}
}
从 xaml 可以像这样使用上述转换器:
Background="{Binding MyBooleanValue, Converter={StaticResource BoolToColorBrushConverter}, ConverterParameter=LimeGreen;Transperent;0.2, Mode=OneWay}"