在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}"