我得到了这个TextBlock:
<TextBlock Foreground="Red"/>
TextBlock有一个带有样式触发器的隐式样式 询问“如果前景是{StaticResource BrushTextBlockAlertForeground} 然后将背景设置为黑色。“ (当然,BrushTextBlockAlertForeground是红色的。)
<Trigger Property="Foreground" Value="{StaticResource BrushTextBlockAlertForeground}">
<Setter Property="Background" Value="Black"/>
</Trigger>
此触发条件失败! 如果静态资源在加载时解析,那么为什么这个触发器失败了 XAML加载器不应该在触发条件下放置Red吗?或者它表达了一些表达? 是否有可能发生因为触发条件的“Value”属性不是依赖属性?
只有当我写
时<Trigger Property="Foreground" Value="Red">
<Setter Property="Background" Value="Black"/>
</Trigger>
如果我从外部放置静态资源(见下文),它在任何情况下都不起作用。像那样:
<TextBlock Foreground="{StaticResource BrushTextBlockAlertForeground}"/>
我很想知道背后的原因,因为我想写出可重复使用的颜色,而不是在许多地方放置“红色”。 “明天”有人会尝试使其可重复使用,并会遇到我遇到的行为。
答案 0 :(得分:1)
确保您测试的TextBlocks和StyleTrigger同时使用(!)刷Red或StaticResource。具有前景Red的TextBlock和具有StaticResource的StyleTrigger(反之亦然)将不起作用,因为值Brushes.Red和StaticResource不相等。见A: How to Compare SolidColorBrushes?
<StackPanel>
<!--this doesn't work-->
<StackPanel.Resources>
<SolidColorBrush x:Key="forebr" Color="Red"/>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Foreground" Value="{StaticResource forebr}">
<Setter Property="Background" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Foreground="Red" Text=" Test trigger 0"></TextBlock>
</StackPanel>
<StackPanel>
<!--this doesn't work-->
<StackPanel.Resources>
<SolidColorBrush x:Key="forebr" Color="Red"/>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Foreground" Value="Red">
<Setter Property="Background" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Foreground="{StaticResource forebr}" Text=" Test trigger 1"></TextBlock>
</StackPanel>
<StackPanel>
<!--this works-->
<StackPanel.Resources>
<SolidColorBrush x:Key="forebr" Color="Red"/>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Foreground" Value="{StaticResource forebr}">
<Setter Property="Background" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Foreground="{StaticResource forebr}" Text=" Test trigger 2"></TextBlock>
</StackPanel>
<StackPanel>
<!--this works-->
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Foreground" Value="Red">
<Setter Property="Background" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Foreground="Red" Text=" Test trigger 3"></TextBlock>
</StackPanel>