具有自定义颜色的DataTrigger



我正在尝试基于作为Border的另一个控件的颜色来设置LabelForeground颜色。如果我使用预定义的XAML颜色作为边框,它会起作用,但如果我使用自定义RGB颜色,它就不会起作用。

以下示例有效,因为用于边框的颜色为blue

<Application.Resources>
<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="Foreground" Value="Green" />
<Style.Triggers>
<DataTrigger Binding="{Binding BorderBrush, ElementName=borderControl}" Value="blue">
<Setter Property="Foreground" Value="red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Application.Resources>
<Border x:Name="borderControl" Background="#ffecec" BorderBrush="blue" BorderThickness="1" Padding="10" Margin="20" CornerRadius="5">
<Label Style="{StaticResource labelStyle}" Content="This message is red if border color is blue" />
</Border>

以下示例不起作用,因为用于边框的颜色是#f5aca6

<Application.Resources>
<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="Foreground" Value="Green" />
<Style.Triggers>
<DataTrigger Binding="{Binding BorderBrush, ElementName=borderControl}" Value="#f5aca6">
<Setter Property="Foreground" Value="red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Application.Resources>
<Border x:Name="borderControl" Background="#ffecec" BorderBrush="#f5aca6" BorderThickness="1" Padding="10" Margin="20" CornerRadius="5">
<Label Style="{StaticResource labelStyle}" Content="This message is green and should be red" />
</Border>

问题是,您分配给类型为Brush(如BorderBrush(的属性的颜色将由类型转换器自动转换为笔刷实例。对于像#f5aca6这样的纯色,将在幕后创建SolidColorBrush的实例。如果使用像Blue这样的预定义笔刷,则实际上是在访问Brushes类上的静态实例

为什么它适用于预定义的笔刷而不适用于自定义颜色?笔刷类型不会覆盖相等比较器,因此DataTrigger将通过引用对它们进行比较。预定义笔刷是静态实例,因此它始终是相同的引用。但是,自定义颜色将创建笔刷的新实例,因此它们不等于通过引用预定义的笔刷。

您可以通过在XAML中创建自定义颜色的笔刷实例并使用它来解决这个问题。

<SolidColorBrush x:Key="CustomBorderBrush" Color="#f5aca6" />

<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="Foreground" Value="Green" />
<Style.Triggers>
<DataTrigger Binding="{Binding BorderBrush, ElementName=borderControl}" Value="{StaticResource CustomBorderBrush}">
<Setter Property="Foreground" Value="red" />
</DataTrigger>
</Style.Triggers>
</Style>
<Border x:Name="borderControl" Background="#ffecec" BorderBrush="{StaticResource CustomBorderBrush}" BorderThickness="1" Padding="10" Margin="20" CornerRadius="5">
<Label Style="{StaticResource labelStyle}"Content="This message is green and should be red" />
</Border>

在具有纯色的特殊情况下,您也可以比较样式中笔刷的Color属性,但请注意,这对于其他笔刷类型(如GradientBrush(是失败的。

<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="Foreground" Value="Green" />
<Style.Triggers>
<DataTrigger Binding="{Binding BorderBrush.Color, ElementName=borderControl}" Value="#f5aca6">
<Setter Property="Foreground" Value="red" />
</DataTrigger>
</Style.Triggers>
</Style>

最新更新