具有自定义颜色的 DataTrigger

DataTrigger with a custom color

我正在尝试根据 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 like BorderBrush will automatically be converted into a brush instance by a type converter. For solid colors like #f5aca6 an instance of a SolidColorBrush will be created behind the scenes. If you use one of the predefined brushes like Blue, you are actually accessing static instances on the Brushes 属性 的颜色 class。

现在为什么它适用于预定义的画笔而不适用于自定义颜色?笔刷类型不会覆盖相等比较器,因此 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>