Поиск…


Вступление

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow