具有自定义颜色的 DataTrigger
DataTrigger with a custom color
我正在尝试根据 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
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>
我正在尝试根据 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
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>