A Trigger
se usa generalmente en un Style
o ControlTemplate
. Se desencadena en las propiedades de lo que se está modelando y establece otras propiedades del control (o de elementos de plantilla específicos). Por ejemplo, utilizaría un disparador en IsMouseOver
para responder que el mouse está sobre el control, y el setters
podría actualizar un pincel para mostrar un efecto "caliente".
¿Por qué usar Trigger?
Los activadores se utilizan en estilos para realizar acciones en un cambio de cualquier valor de propiedad o incendios de evento. Los desencadenantes crean efectos visuales en los controles. Al usar Triggers, podemos cambiar la apariencia de los Elementos del Marco.
¿Cuántos tipos de desencadenantes hay en WPF?
Hay cinco tipos de activadores admitidos por WPF; que son:
- propiedad de disparo
- Trigger Data
- MultiTrigger
- MultiDataTrigger
- evento de disparo
propiedad de disparo
La forma más simple de un desencadenador es un desencadenante de propiedad, que busca que una propiedad de dependencia tenga un cierto valor. Por ejemplo, si quisiéramos encender un botón en amarillo a medida que el usuario mueve el mouse sobre él, podemos hacer eso al observar que la propiedad IsMouseOver
tenga un valor de "True
".
Property Trigger
Ejecuta Colecciones de Setters, cuando cambia el valor de propiedad de UIElements.
Para crear un disparador de propiedad en cualquier control, debe establecer el activador en el estilo del control.
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value="0.5" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
En el código anterior, Trigger
creado en el botón. Establecerá Opacity
en 0.5 cuando cambie la propiedad Botones IsPressed
. puede establecer el desencadenador en cualquier Propiedad de dependencia del control. p.
<Style x:Key="NormalStyle">
<Setter Property="Control.FontSize" Value="20"></Setter>
<Setter Property="Control.HorizontalAlignment" Value="Center"></Setter>
<Setter Property="Control.Margin" Value="10"></Setter>
<Setter Property="Control.Foreground" Value="Black"></Setter>
<Style.Triggers>
<Trigger Property="Control.IsMouseOver" Value="true">
<Setter Property="Control.FontStyle" Value="Italic"></Setter>
<Setter Property="Control.Foreground" Value="Red"></Setter>
<Setter Property="Control.Background" Value="Yellow"></Setter>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property="Control.Foreground" Value="Green"></Setter>
<Setter Property="Control.Background" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
MultiTrigger
MultiTrigger se utiliza para establecer la acción sobre el cambio de la propiedad múltiple. Se ejecutará cuando todas las condiciones se cumplan dentro de MulitTrigger
. Condición.
<Style x:Key="MulitTriggerButtonStyle" TargetType="Button">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsPressed" Value="True" />
<Condition Property="Background" Value="BlanchedAlmond" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Foreground" Value="Blue" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush" Value="Blue" />
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>
evento de disparo
Event Trigger
utilizado realizar la acción cuando RoutedEvent
de FrameworkElement aumento. Event Trigger
utiliza generalmente para realizar una animación en el control (como: ColorAnimation, doubleAnumation usando KeyFrame etc.)
primero vamos a entender Storyboard
y Animation
.
Animations
:
Una animación puede proporcionar la interfaz de usuario más atractiva con la apariencia. También podemos crear efectos visuales en el control, la animación puede ser de cualquier tipo, como:
cambio de color de fondo del control pantalla de rotación de 90 grados de ángulo objeto se mueva de un lugar a otro Cambio de opacidad (FadeIn/FadeOut) del círculo.
La animación se utiliza con Property of the UIElement.WPF proporciona diferentes tipos de animación utilizados con propiedades, como:
ColorAnimation
: utilizado para animar/cambiar la propiedad de color (SolidColorBrush, LinearGradientBrush) de la UIElement sobre Duración específico. Tiene dos propiedades:
De (fuente) y A (objetivo)
<Border Name="border1" Width="100" Height="30"
BorderBrush="Black" BorderThickness="1">
<Border.Background>
<SolidColorBrush x:Name="MyBorder" Color="LightBlue" />
</Border.Background>
<Border.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Duration="0:0:1"
Storyboard.TargetName="MyBorder"
Storyboard.TargetProperty="Color" To="Gray" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
</Border>
Ejemplo 2:
<TextBlock Visibility="Collapsed" Style="{StaticResource CDCStandardTextBlockStyle}" Name="TxtBlockTerminatingHeading" Text="{Binding NotifyOnTargetUpdated=True}" Foreground="Red" TextWrapping="Wrap" Margin="10,10,10,0">
<TextBlock.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard BeginTime="00:00:00" RepeatBehavior="Forever"
Storyboard.TargetName="TxtBlockTerminatingHeading"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)">
<ColorAnimation From="Red" To="#f0f0f0"
Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
Ejemplo 3:
<ListBox Name="employeeListBox" ItemsSource="{Binding
empList}" Grid.Row="0" SelectedItem="{Binding SelectedIndex}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding
ElementName=employeeListBox, Path=SelectedValue}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
DataTrigger
DataTriggers
son desencadenantes que miran un valor dependiente en lugar de Dependency
Property
. Le permiten ver una expresión encuadernada, y reaccionarán cuando ese enlace se evalúe igual a su valor. Como su nombre lo sugiere, DataTrigger
aplica el valor de propiedad para realizar una acción en los datos que vinculan al UIElement. DataTrigger
permite establecer el valor de propiedad cuando los datos de enlace coinciden con las condiciones especificadas. Por ejemplo:
<DataTemplate>
<Grid Margin="0 5 0 0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Image x:Name="viewImage"
Grid.Row="0" Width="100"
Height="60" HorizontalAlignment="Center"
Source="{Binding Picture}" Stretch="Fill" />
<TextBlock x:Name="viewText"
Grid.Row="1" Margin="0 5 0 0"
HorizontalAlignment="Center"
FontWeight="Black" Foreground="Green"
Text="{Binding Title}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Picture}" Value="{x:Null}">
<Setter TargetName="viewImage" Property="Source" Value="/Images/noImage.png" />
<Setter TargetName="viewText" Property="Text" Value="No Image Available" />
<Setter TargetName="viewText" Property="Foreground" Value="Red" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=textBox1, Path=Text.Length}"
Value="0">
<Setter Property="IsEnabled" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
MultiDataTrigger
MultiTrigger
y MultiDataTrigger
son los mismos, salvo que le permiten especificar varias condiciones (propiedades o atascamientos, respectivamente) y se hacen efectivas sólo cuando se cumplan todas las condiciones.
<DataTemplate.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Picture}" Value="{x:Null}" />
<Condition Binding="{Binding Path=Title}" Value="Waterfall" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter TargetName="viewImage" Property="Source" Value="/Images/noImage.png"/>
<Setter TargetName="viewImage" Property="Opacity" Value="0.5" />
<Setter TargetName="viewText" Property="Background" Value="Brown" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</DataTemplate.Triggers>
+1 Respuesta completa con ejemplos agradables. – statenjason
¡Thx! Muy clarificador ¡Justo lo que necesitaba! – stiank81
Deseo que los libros técnicos utilicen más ejemplos. Útil cuando solo quiere hojear los temas. – arviman