Tradotta in italiano la parola trigger identifica qualcosa in grado di scatenare un innesco, o anche un qualcosa che è capace di scatenare un qualche processo.
Non a caso un altro significato della stessa parola è grilletto !
La stessa parola viene anche utilizzata in WPF per identificare una funzionalità utilizzata in tandem con gli stili, e che, seguendo il significato originale della parola, permette di cambiare il look and feel dei controlli allo scatenarsi di determinati eventi o condizioni prestabilite.
Per esempio si immagini di voler cambiare l’aspetto di un controllo qualora il mouse si trova sopra questo: in questo caso la causa scatenante è il mouse posizionato sopra un controllo, e l’effetto che si vuole ottenere è che il controllo stesso cambi qualche elemento dello stile.
Certo: è possibile ottenere questo risultato con l’ausilio di codice C# associato e determinati eventi. Purtuttavia è possibile ottenere lo stesso effetto anche con l’ausilio di sole dichiarazioni WPF e l’ausilio dei trigger.
Ora Vi prego: non “cambiate canale”. L’esempio proposto sopra per illustrare l’uso dei trigger può sembrare poco interessante: un controllo che cambia aspetto quando il mouse si posiziona sopra di esso è molto “anni ‘90” e quando mi capita di vederlo in qualche maschera mi provoca tenerezza.
In realtà vedremo a breve che i trigger risultano essere indispensabili in altri ambiti decisamente molto più interessanti.
WPF offre diverse tipologia di trigger che Vi esplicito nel seguito.
- Property trigger – è il trigger più utilizzato e viene attivato non appena una proprietà di un controllo assume un determinato valore.
- Multi-trigger – come quello precedente, solo che viene attivato quando diverse proprietà assumono contemporaneamente determinati valori.
- Event trigger – viene attivato quando un determinato evento occorre.
- Data trigger – viene azionato quando dei dati in binding cambiano valore.
In questa serie per brevità ho pensato di lasciare fuori gli event trigger, poiché li ritengo meno interessanti rispetto agli altri.
Property Trigger
<Window x:Class="Wpf002_Trigger.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Wpf002_Trigger" mc:Ignorable="d" Title="MainWindow-Trigger" Height="350" Width="525"> <Window.Resources> <Style TargetType="TextBox"> <Setter Property="Background" Value="LightGray" /> <Setter Property="BorderThickness" Value="2"></Setter> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontStyle" Value="Italic"></Setter> <Setter Property="BorderThickness" Value="9"></Setter> </Trigger> <Trigger Property="Text" Value="Test"> <Setter Property="Background" Value="Red" /> </Trigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBox Grid.Column="1" Grid.Row="1">Text box test trigger</TextBox> </Grid> </Window>
Dal codice è possibile vedere come nel Windows Resouce si sia impostato uno stile di default che sarà applicato a tutti i textbox presenti (istruzione targetype uguale TextBox).
Questo stile è corredato della definizione di un trigger (style.trigger): in questo caso si definisce che il trigger debba essere azionato quando la proprietà IsMouseOver del controllo assume il valore True.
Questo avviene quando il mouse si trova posizionato sopra la casella di testo. La proprietà setter definisce, infine, cosa deve succedere allo scattare del trigger: in questo caso lo stile stesso varia proponendo un bordo più spesso (BorderThickness).
Cosa analoga occorre al verificarsi dell’evento Text = Test, cioè quando all’interno della casella di testo sarà digitata la parola Test.
Oss.: Non c’è bisogno di impostare un trigger per riportare i valori al punto originario: viene fatto in automatico.
MultiTrigger
….e se si volesse far si che la texbox abbia determinate caratteristiche quando il mouse è sopra di essa (proprietà IsMouseOver=True) E contiene la parola Test (proprietà text = test) ???
Bene: questo è possibile tramite il multitrigger, che in pratica è un trigger che però tiene sotto monitoraggio più proprietà.
<Window x:Class="Wpf002_Trigger.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Wpf002_Trigger" mc:Ignorable="d" Title="MainWindow-Trigger" Height="350" Width="525"> <Window.Resources> <Style TargetType="TextBox"> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> <Condition Property="Text" Value="Test" /> </MultiTrigger.Conditions> <MultiTrigger.Setters> <Setter Property="Foreground" Value="Red" /> </MultiTrigger.Setters> </MultiTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBox Grid.Column="1" Grid.Row="1">Text box test trigger</TextBox> </Grid> </Window>
Appare chiaro che i multitrigger si basano su diverse condizioni concorrenti che devono verificarsi contemporaneamente tutti per poter scattare.