我正在尝试基于作为Border
的另一个控件的颜色来设置Label
的Foreground
颜色。如果我使用预定义的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>