如何在 XAML (WPF) 中设置相邻触发器的优先级
How to set priority of neighboring Triggers in XAML (WPF)
很少Triggers/MultiTriggers影响同一个ControlTemplate中同一个Target的同一个属性。在同时激活所有的情况下,它们之间的优先级是什么定义的?
<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 灰色。
所有触发器都是从上到下计算的。
在伪代码中,这转换为
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,则背景将为灰色而前景将为红色,因为从上到下评估触发器并应用设置器。希望这有帮助。
很少Triggers/MultiTriggers影响同一个ControlTemplate中同一个Target的同一个属性。在同时激活所有的情况下,它们之间的优先级是什么定义的?
<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 灰色。
所有触发器都是从上到下计算的。 在伪代码中,这转换为
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,则背景将为灰色而前景将为红色,因为从上到下评估触发器并应用设置器。希望这有帮助。