WPF将布尔值转换为彩色字符串

时间:2016-02-11 10:17:02

标签: c# wpf xaml colors

我坚持"简单"转换。我有一个方法。它检查连接。如果建立了连接,则更改我的viewmodel的boolean属性。我想要做的是在我的表单上显示彩色字符串(红色"连接失败"或绿色"建立连接"取决于布尔属性)但我不喜欢&#39 ;不知道该怎么做。

6 个答案:

答案 0 :(得分:6)

这里有两个选项,因为您没有提供任何特定代码,我将只提供一些资源:

第一个选项是使用触发器更新文本的属性。这将在xaml中实现,只需观察绑定属性以获取特定值(在您的情况下为true或false)并相应地更新颜色。这也是@Kylo-Ren所做的。 有关这方面的信息可以在这里找到:

http://www.wpf-tutorial.com/styles/trigger-datatrigger-event-trigger/

另一个选项是使用IValueConverter接口并将布尔值转换为颜色。这就是@Stefan所做的。更多信息:

http://www.codeproject.com/Tips/868163/IValueConverter-Example-and-Usage-in-WPF

如果你只有一个非常有限的属性可以采用的值和/或你想一次更新多个视觉属性,我会推荐第一个版本。

第二个版本更适合更复杂的转换(例如将完整对象转换为格式化字符串),但不能轻易用于更新多个视觉属性。

经验法则:

我想指出一个州=>使用触发器

我想以特定方式显示对象值(例如Text)=>使用IValueConverter

答案 1 :(得分:5)

使用以下(更改控件类型与您正在使用的):

<TextBox Text="content" >
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ConnectionStatus}" Value="true">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ConnectionStatus}" Value="false">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

答案 2 :(得分:2)

最好的方法是使用IValueConverter进行绑定。只需实现新的转换器类:

public class BoolToColorConverter : IValueConverter
{
    object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = (bool) value;
        // your convertion logic here
        // return Brushes.Black;
    }

    object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

接下来,将您的转换器添加到XAML中的资源:

<Window.Resources>
    <l:BoolToColorConverter x:Key="boolToColorConverter" />
</Window.Resources>

并在数据绑定中使用它:

<TextBox Background="{Binding YourBoolPropertyName, 
        Converter={StaticResource boolToColorConverter}}" />

您可以阅读有关转化器here的更多信息。

答案 3 :(得分:1)

  1. 创建一个IValueConverter,如果参数为&#34; Color&#34;它将布尔值转换为Color。如果参数为&#34;文本&#34;。
  2. ,则bool to Text
  3. 想象一下,您在表单上有一个TextBlock,您想要显示文本(它可以是您喜欢的任何控件):
  4. <TextBlock Text="{Binding MyBoolValue,Converter={StaticResource MyConverter,ConverterParameter=Text}}" Foreground="{Binding MyBoolValue,Converter={StaticResource MyConverter,ConverterParameter=Color}}"/>

    上述解决方案不完整,仅显示基础知识。如果您遇到困难,请随时提出其他问题。

答案 4 :(得分:0)

虽然已经发布了Converter,但我创建了一个更可重用的BooleanToColorConverter。您可以将它用于不同的场景,如下所示。

[ValueConversion(typeof(bool), typeof(SolidColorBrush))]
public class BooleanToColorConverter : IValueConverter
{
    public Brush TrueBrush { get; set; }

    public Brush FalseBrush { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var boolValue = value as bool? ?? true;
        if (parameter != null && parameter.ToString() == "!")
        {
            boolValue = !boolValue;
        }

        if (boolValue)
        {
            return TrueBrush;
        }
        return FalseBrush;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

现在在资源的XAML中你可以有这样的东西:

<ResourceDictionary>
    <converter:BooleanToColorConverter x:Key="BooleanToColorConverter" FalseBrush="#4CFF0000" TrueBrush="#4C00FF00" />
    <converter:BooleanToColorConverter x:Key="ReadOnlyToColorConverter" TrueBrush="LightGray"/>
</ResourceDictionary>

现在你可以像这样在Background属性上使用它(IsReadOnly是Type bool的属性):

Background="{Binding IsReadOnly, Converter={StaticResource ReadOnlyToColorConverter}}"

PS。这段代码:

if (parameter != null && parameter.ToString() == "!")
    {
        boolValue = !boolValue;
    }

只是为了你可以在需要时轻松反转你的颜色。您可以像这样使用它:

Background="{Binding IsReadOnly, Converter={StaticResource ReadOnlyToColorConverter}, ConverterParameter=!}"

答案 5 :(得分:-1)

您可以创建名为ConnectionStatusColor的SolidColorBrush属性。在它的获取中,您可以执行以下操作:

return connectionSuccess ? Brushes.Green : Brushes.Red

不要忘记实施INotifyPropertyChanged,以便应用绑定。

或者您可以创建IValueConverter并在绑定中使用它。

 class BoolToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool) value ? Brushes.Green : Brushes.Red;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }