Szukaj…
Wprowadzenie
Dyskusja na temat różnych rodzajów wyzwalaczy dostępnych w WPF, w tym Trigger
, DataTrigger
, MultiTrigger
, MultiDataTrigger
i EventTrigger
.
Wyzwalacze pozwalają dowolnej klasie, która wywodzi się z FrameworkElement
lub FrameworkContentElement
na ustawianie lub zmianę ich właściwości w oparciu o określone warunki określone w wyzwalaczu. Zasadniczo, jeśli element można stylizować, można go również uruchomić.
Uwagi
- Wszystkie wyzwalacze, z wyjątkiem
EventTrigger
muszą być zdefiniowane w elemencie<Style>
.EventTrigger
może być zdefiniowany w elemencie<Style>
lub we właściwościTriggers
kontrolki. - Elementy
<Trigger>
mogą zawierać dowolną liczbę elementów<Setter>
. Te elementy są odpowiedzialne za ustawianie właściwości elementu zawierającego, gdy warunek elementu<Trigger>
jest spełniony. - Jeśli właściwość jest zdefiniowana w znaczniku elementu głównego, zmiana właściwości zdefiniowana w elemencie
<Setter>
nie będzie obowiązywać, nawet jeśli warunek wyzwalania zostanie spełniony. Rozważ znacznik<TextBlock Text="Sample">
. WłaściwośćText
kodu postępowania nigdy się nie zmieni w zależności od wyzwalacza, ponieważ definicje właściwości root mają pierwszeństwo przed właściwościami zdefiniowanymi w stylach. - Podobnie jak wiązania, po użyciu wyzwalacza nie można go modyfikować.
Spust
Najprostszy z pięciu typów wyzwalaczy, Trigger
odpowiada za ustawianie właściwości na podstawie innych właściwości w ramach tego samego elementu sterującego .
<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>
W tym przykładzie kolor pierwszego planu TextBlock
zmieni kolor na zielony, gdy jego właściwość Text
będzie równa ciągowi znaków "Pass"
.
MultiTrigger
MultiTrigger
jest podobny do standardowego Trigger
, ponieważ ma zastosowanie tylko do właściwości w ramach tej samej kontroli . Różnica polega na tym, że MultiTrigger
ma wiele warunków, które muszą zostać spełnione, zanim wyzwalacz zadziała. Warunki są definiowane za pomocą znacznika <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>
Zauważ, że MultiTrigger
nie aktywuje się, dopóki nie zostaną spełnione oba warunki.
DataTrigger
DataTrigger
może być dołączony do dowolnej właściwości, niezależnie od tego, czy jest to jego własna kontrola, inna kontrola, a nawet właściwość w klasie innej niż interfejs użytkownika. Rozważ następującą prostą klasę.
public class Cheese
{
public string Name { get; set; }
public double Age { get; set; }
public int StinkLevel { get; set; }
}
Które dołączymy jako DataContext
w następującym 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>
W poprzedzającym kodzie właściwość TextBlock.Foreground
będzie miała TextBlock.Foreground
zielony. Jeśli StinkLevel
właściwość StinkLevel
w naszym XAML na wartość inną niż 100, właściwość Text.Foreground
powróci do wartości domyślnej.