Как установить приоритет соседних триггеров в XAML (WPF) - PullRequest
0 голосов
/ 29 октября 2018

Существует несколько триггеров / мультитриггеров, влияющих на одно и то же свойство одной и той же цели в одном и том же шаблоне 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>

В моем примере у меня есть ControlTemplate для ProgressBar, где я установил два триггера для своего пользовательского элемента "background". Если ProgressBar отключен и не определен, у меня есть эффект триггера # 2, который делает его оранжевым, в то время как я хочу сделать его серым # 1 в таком случае.

1 Ответ

0 голосов
/ 30 октября 2018

Все триггеры оцениваются сверху вниз. В псевдокоде это переводится как

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, фон будет серым, а передний план будет красным, потому что триггеры оцениваются, а установщики применяются сверху вниз. Надеюсь, это поможет.

...