如何在XAML(WPF)中设置相邻触发器的优先级

时间:2018-10-29 15:12:03

标签: wpf xaml triggers controltemplate

很少有触发器/多重触发器会影响同一ControlTemplate中同一目标的同一属性。在同时激活所有人的情况下,如何定义它们之间的优先级?

<ControlTemplate.Triggers>

   <Trigger Property="IsEnabled" Value="False"> <!-- #1 -->
       <Setter TargetName="background" Property="Fill" Value="Gray"/>
   </Trigger>

   <Trigger Property="IsIndeterminate" Value="True"> <!-- #2 -->
       <Setter TargetName="background" Property="Fill" Value="Orange"/>
   </Trigger>

</ControlTemplate.Triggers>

在我的示例中,我具有用于ProgressBar的ControlTemplate,在其中为自定义“ background”元素设置了两个触发器。如果ProgressBar同时被禁用和不确定,那么我将获得#2触发器的效果,使其变为橙色,而在这种情况下,我希望使其变为#1灰色。

1 个答案:

答案 0 :(得分:0)

所有触发器均从上至下进行评估。 用伪代码将其翻译为

if (IsEnabled == false) { background.Fill = Gray }
if (isIndeterminate == true) { background.Fill = Orange }

因此,如果您想获得理想的结果,只需将它们交换为

<Trigger Property="IsIndeterminate" Value="True"> <!-- #2 -->
    <Setter TargetName="background" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False"> <!-- #1 -->
    <Setter TargetName="background" Property="Fill" Value="Gray"/>
</Trigger>

例如,如果我们做了进一步回答您先前的问题

<Trigger Property="IsIndeterminate" Value="True"> <!-- #2 -->
    <Setter TargetName="background" Property="Fill" Value="Orange"/>
    <Setter TargetName="forground" Property="Fill" Value="Red"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False"> <!-- #1 -->
    <Setter TargetName="background" Property="Fill" Value="Gray"/>
</Trigger>

如果IsInderminate为true并且IsEnabled为false,则背景将为灰色,前景将为红色,因为将评估触发器并从上至下应用设置器。希望这会有所帮助。