Поиск…
Вступление
Обсуждение различных типов триггеров, доступных в WPF, включая Trigger
, DataTrigger
, MultiTrigger
, MultiDataTrigger
и EventTrigger
.
Триггеры позволяют любому классу, полученному из FrameworkElement
или FrameworkContentElement
устанавливать или изменять свои свойства на основе определенных условий, определенных в триггере. В принципе, если элемент можно стилизовать, он также может быть запущен.
замечания
- Все триггеры, за исключением
EventTrigger
должны быть определены в элементе<Style>
.EventTrigger
может быть определен как в элементе<Style>
, так и в элементе управленияTriggers
. - Элементы
<Trigger>
могут содержать любое количество элементов<Setter>
. Эти элементы отвечают за настройку свойств в содержащем элементе, когда выполняется условие элемента<Trigger>
. - Если свойство определено в разметке корневого элемента, изменение свойства, определенное в элементе
<Setter>
, не вступит в силу, даже если условие триггера выполнено. Рассмотрим разметку<TextBlock Text="Sample">
. СвойствоText
действующего кода никогда не будет изменяться на основе триггера, потому что определения свойств корня имеют значение для свойств, определенных в стилях. - Подобно привязкам, как только триггер был использован, он не может быть изменен.
Спусковой крючок
Самый простой из пяти типов триггеров, Trigger
отвечает за настройку свойств на основе других свойств внутри одного элемента управления .
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="Pass">
<Setter Property="Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
В этом примере цвет переднего плана TextBlock
станет зеленым, если свойство Text
равно строке "Pass"
.
MultiTrigger
MultiTrigger
похож на стандартный Trigger
поскольку он применяется только к свойствам одного и того же MultiTrigger
управления . Разница в том, что MultiTrigger
имеет множество условий, которые должны быть выполнены до срабатывания триггера. Условия определяются с помощью <Condition>
.
<TextBlock x:Name="_txtBlock" IsEnabled="False">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="Pass"/>
<Condition Property="IsEnabled" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Green"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Обратите внимание, что MultiTrigger
не активируется до тех пор, пока не будут выполнены оба условия.
DataTrigger
DataTrigger
может быть привязан к любому свойству, будь то его собственный контроль, другой элемент управления или даже свойство в классе, DataTrigger
от UI. Рассмотрим следующий простой класс.
public class Cheese
{
public string Name { get; set; }
public double Age { get; set; }
public int StinkLevel { get; set; }
}
Который мы будем прикреплять как DataContext
в следующем TextBlock
.
<TextBlock Text="{Binding Name}">
<TextBlock.DataContext>
<local:Cheese Age="12" StinkLevel="100" Name="Limburger"/>
</TextBlock.DataContext>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StinkLevel}" Value="100">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
В предыдущем коде свойство TextBlock.Foreground
будет зеленым. Если мы изменим свойство StinkLevel
в нашем XAML на что-либо, кроме 100, свойство Text.Foreground
вернется к его значению по умолчанию.