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

时间:2011-12-16 11:29:26

标签: c# wpf xaml converter

我正在研究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();
    }
}

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

XAML中与

相关的文本块是:

   <Window.Resources>
            <local:BrushColorConverter x:Key="BConverter"></local:BrushColorConverter>
   </Window.Resources>
<Button>(!..all button properties..!)</Button>
    <TextBlock x:Name="AnswerText"                                           
               Text="Answer"                                          
               Foreground="{Binding ElementName=AnswerButton,Path=IsEnabled, Converter={StaticResource BConverter}}"
               TextWrapping="Wrap"/>

3 个答案:

答案 0 :(得分:40)

使用 返回新的SolidColorBrush(Colors.Black);

答案 1 :(得分:16)

上面的答案向您展示了如何正确使用转换器。但是,你真的需要使用转换器吗?只能使用Triggers

在XAML中完成此操作

<强> XAML

        <StackPanel>

            <Button IsEnabled="{Binding ElementName=isEnabledCheckBox, Path=IsChecked}">
                <TextBlock Text="Answer" TextWrapping="Wrap">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsEnabled}" Value="True">
                                    <Setter Property="Foreground" Value="Green"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </Button>

            <Button IsEnabled="{Binding ElementName=isEnabledCheckBox, Path=IsChecked}">
                <TextBlock Text="Answer" TextWrapping="Wrap">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <Trigger Property="IsEnabled" Value="True">
                                    <Setter Property="Foreground" Value="Green"/>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </Button>

            <CheckBox x:Name="isEnabledCheckBox" Content="Toggle IsEnable on Buttons above" />

        </StackPanel>

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

然而,这是过度的 - IsEnabled属性由WPF自动传播到子节点。也就是说,如果您在IsEnabled上将Button设置为false,那么您的TextBlock会自动将其IsEnabled属性更新为false。这在第二个TextBlock中进行了演示,它使用属性Trigger来检查自己的IsEnabled属性是否为true(因为其IsEnabled属性将与其相同父母)。这将是首选方法。

希望这有帮助!

答案 2 :(得分:6)

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

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

因此,我制作了一个名为"LimeGreen"的辅助方法。如果ConverterParameter的插入失败,我将"Transparent"指定为后备颜色。在我的情况下,当value为false时,我希望输出为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); } }

Background="{Binding MyBooleanValue, Converter={StaticResource BoolToColorBrushConverter}, ConverterParameter=LimeGreen;Transperent;0.2, Mode=OneWay}"

从xaml可以像这样使用上述转换器:

{{1}}