在XAML中使用boolean到颜色转换器

我正在研究WPF应用程序。我已将文本块绑定到我的按钮。 当关联按钮的isEnabled为true时,我想将文本块的前景设置为黑色。 我想用转换器来做这件事。 但它不起作用 。 也没有给出任何错误。 我在“Models”文件夹中声明了以下类。

public class BrushColorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if ((bool)value) { { return System.Windows.Media.Colors.Black; } } return System.Windows.Media.Colors.LightGreen; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

Button的启用,可从viewmodel更改属性 (例如,使用RaiseCanExecuteChanged)())

XAML中与textblock相关的东西是:

       

使用return new SolidColorBrush(Colors.Black);

上面的答案显示了如何正确使用转换器。 但是,你真的需要使用转换器吗? 这只能使用Triggers在XAML中完成:

XAML

       

在上面的示例中,第一个TextBlock使用DataTrigger绑定到其父级的IsEnabled属性,如果为true,则将Foreground设置为某种颜色。

但是,这是过度的IsEnabled属性由WPF自动传播到子节点。 也就是说,如果在Button上将IsEnabled设置为false,则TextBlock会自动将其IsEnabled属性更新为false。 这在第二个TextBlock得到了certificate,它使用属性Trigger来检查其自身的IsEnabled属性,而不是true(因为它的IsEnabled属性将与其父类相同)。 这将是首选方法。

希望这可以帮助!

要使此转换器通用,您可以使用ConverterParameter指定value true或false时要插入的颜色。 此外,不透明度可能是有意义的。 我在这里提供转换器我采用参数[ColorNameIfTrue; ColorNameIfFalse; OpacityNumber]。

由于@ user1101511提到的SolidColorBrush()方法是System.Windows.Media库的一部分,因此它使用同一个库中的Color类型。 此类型没有Color.FromName()方法,如System.Drawing.Color类。

因此,我制作了一个名为ColorFromName(string name)的辅助方法。 如果ConverterParameter插入失败,我将"LimeGreen"指定为后备颜色。 在我的情况下,当value false时,我希望输出为"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 ///  /// ///  /// Bolean value controlling wether to apply color change ///  /// A CSV string on the format [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber] may be provided for customization, default is [LimeGreen;Transperent;1.0]. ///  /// A SolidColorBrush in the supplied or default colors depending on the state of value. 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}"