22.4 Trigger 

Die bisher verwendeten Ressourcen (inklusive Stile) ändern sich nicht durch den Zustand der Anwendung. Mit Zustand ist hier nicht der Satz an Stilen gemeint, die sich bei einer dynamischen Bindung automatisch ändern, sondern stilunabhängige Zustände. Zum Beispiel können häufiger genutzte Buttons etwas größer dargestellt werden, oder eine Textverarbeitung kann die Textdarstellung ändern, wenn ein Text sehr lange nicht mehr gesichert wurde.
Die Lösung sind Trigger, die für die Reaktion auf Ereignisse, Eigenschaftsänderungen usw. verwendet werden. Trigger werden oft zusammen mit Stilen verwendet, können aber auch der Eigenschaft Triggers einer Komponente direkt zugewiesen werden. Eine Komponente darf auch mehrere Trigger haben, um auf verschiedene Zustandsänderungen unterschiedlich zu reagieren.
22.4.1 Eigenschaftstrigger 

Bewegen Sie beispielsweise die Maus über eine Schaltfläche, ändert sich der Hintergrund und der Rahmen des Steuerelements in einer vordefinierten Art. Wollen Sie die Art der Änderung selbst definieren, können Sie einen passenden Ereignishandler implementieren. Alternativ können Sie in XAML die Zustandsänderung erfassen und darauf reagieren.
WPF-Komponenten haben Eigenschaften, die einen bestimmten Zustand beschreiben. Mit IsMoueOver lässt sich beispielsweise feststellen, ob sich der Mauszeiger aktuell über der Komponente befindet, und mit IsPressed prüfen Sie, ob auf die Komponente geklickt wird. Die Prüfung beschränkt sich aber nicht nur auf IsXXX-Eigenschaften. So lässt sich zum Beispiel auch die Eigenschaft Text einer TextBox auf einen bestimmten Inhalt hin untersuchen.
Eigenschaftstrigger werden in einem Style-Element definiert. Jeder Trigger steht in einem eigenen Trigger-Element innerhalb eines Style.Triggers-Abschnitts. Dessen Eigenschaften Property und Value nennen die Eigenschaft und deren Wert, die überwacht werden sollen. Hat die Eigenschaft zur Laufzeit den Wert der Value-Einstellung, wird der Trigger aktiviert, und die darin enthaltenen Setter-Elemente werden ausgewertet.
<Style> |
Das Beispiel aus Abschnitt 22.3.1, »Einfache Stile«, wird im Folgenden durch einen Trigger ergänzt, der die Darstellung der Schaltfläche unter der Maus ändert:
'...\WPFKonzepte\Trigger\Einfach.xaml |
<Window ...>
<Window.Resources>
<Style x:Key="MyStyle">
<Setter Property="Control.Height" Value="35" />
<Setter Property="Control.FontSize" Value="18" />
<Setter Property="Control.Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="LightCyan" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter Property="Control.FontStyle" Value="Italic" />
<Setter Property="Control.Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="Yellow" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<Button Style="{StaticResource MyStyle}">Button1</Button>
<Button Style="{StaticResource MyStyle}">Button2</Button>
<Button Style="{StaticResource MyStyle}">Button3</Button>
</StackPanel>
</Window>
Ein Trigger nimmt Änderungen an einer oder mehreren Komponenten vor. Diese werden rückgängig gemacht, wenn die im Trigger angegebene Bedingung nicht mehr erfüllt ist. Verlässt in unserem Beispiel der Mauszeiger den Bereich eines Buttons, kehrt dieser wieder in seinen Ausgangszustand zurück.
MultiTrigger
Einen von mehreren Bedingungen abhängigen Trigger definieren Sie in einem MultiTrigger-Element. Jede Bedingung wird in einem eigenen Condition-Element angegeben, das sich im Conditions-Abschnitt des MultiTrigger-Elements befindet. Nur wenn alle Bedingungen erfüllt sind, löst der Trigger aus.
Im folgenden Beispiel enthält Window eine TextBox-Komponente mit einem Textinhalt. Wenn die Textbox leer ist und sich gleichzeitig der Mauszeiger über der Textbox befindet, wird deren Hintergrund in Rot dargestellt.
'...\WPFKonzepte\Trigger\Multi.xaml |
<Window ...>
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="TextBox.IsMouseOver" Value="true" />
<Condition Property="TextBox.Text" Value="" />
</MultiTrigger.Conditions>
<Setter Property="TextBox.Background" Value="Red" />
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="20" Width="200">
Windows Presentation Foundation WPF
</TextBox>
</StackPanel>
</Window>
22.4.2 Ereignistrigger 

Ereignistrigger werden durch Ereignisse vom Typ RoutedEvent ausgelöst. Darüber können Sie »Animationen« starten. Neben grafischen Spielereien können zum Beispiel Tabellen mit Börsendaten permanent auf dem aktuellen Stand gehalten werden.
Hinweis |
Eigenschaften in einem Ereignistrigger permanent zu ändern ist nicht möglich. |
Sehen wir uns zuerst die Struktur eines solchen Triggers in XAML an:
<Style ...> |
Ereignistrigger werden in einem Style-Element oder direkt in einer Komponente definiert. Jeder Ereignistrigger steht in einem eigenen EventTrigger-Element mit einem zwingend vorgeschriebenen RoutedEvent-Attribut. Hier wird das auslösende Ereignis angegeben. In einem EventTrigger.Actions-Element werden die Aktionen festgelegt, die beim Auslösen des Triggers ausgeführt werden sollen.
Der Start und das Ende der Aktionen werden in den Elementen BeginStoryBoard und StopStoryBoard spezifiziert. Eine StoryBoard-Komponente ist eine Art Container, in dem die Animation über eine Zeitlinie hinweg abläuft.
Das folgende Beispiel zeigt einen simplen Einsatz anhand des Ereignisses MouseEnter. Wird zur Laufzeit die Maus über die Schaltfläche gezogen, »verschwindet« diese zunächst, weil die Eigenschaft Opacity auf 0 gesetzt wird. Im Laufe der folgenden 10 Sekunden wird die Sichtbarkeit des Buttons kontinuierlich wiederhergestellt.
'...\WPFKonzepte\Trigger\Ereignis.xaml |
<Window ...>
<Window.Resources>
<Style TargetType="{x:Type Button}"><Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation From="0" To="1" Duration="0:0:10"
Storyboard.TargetProperty="(Opacity)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers></Style>
</Window.Resources>
<StackPanel>
<Button Height="50">Button1</Button>
</StackPanel>
</Window>
22.4.3 Datentrigger 

Im Gegensatz zu Eigenschaftstriggern reagieren Datentrigger auf die Änderung einer beliebigen Eigenschaft. Ereignistrigger berücksichtigen hingegen nur abhängige Eigenschaften.
Jeder Datentrigger wird in einem eigenen DataTrigger-Element spezifiziert, das in einer Triggers-Liste steht. Da Datentrigger auch mit nicht-abhängigen Eigenschaften umgehen können, wird anstelle des Attributs Property das Attribut Binding angegeben.
Den Einsatz eines Datentriggers zeigt das folgende Beispiel. Das Fenster enthält eine TextBox. Wird zur Laufzeit die Zeichenfolge »Weg damit« eingetragen, wird sie deaktiviert.
'...\WPFKonzepte\Trigger\Daten.xaml |
<Window ...>
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger
Binding=
"{Binding RelativeSource={RelativeSource Self}, Path=Text}"
Value="Weg damit">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Height="23" VerticalAlignment="Center" />
</StackPanel>
</Window>
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.