在WPF中,当使用样式、资源以及数据绑定时,即使不使用代码,也能完成大部分功能。
触发器就是实现该功能的另一种方法,可以自动完成简单样式的改变。
1、简单触发器
我们可以为任何一个依赖项属性关联一个简单触发器,每个简单触发器都关联了一个正在监视的属性。
<Window x:Class="_28.Trigger.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="style1">
<Style.Setters>
<Setter Property="Control.FontFamily" Value="Times New Roman"></Setter>
<Setter Property="Control.FontSize" Value="32"></Setter>
</Style.Setters>
<Style.Triggers>
<Trigger Property="Control.IsFocused" Value="True">
<Setter Property="Control.Foreground" Value="Yellow"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel Margin="5">
<Button Margin="5" Content="Button1" Height="Auto" Name="button1" Width="Auto"
Style="{StaticResource ResourceKey=style1}"/>
<Button Margin="5" Content="Button2" Height="Auto" Name="button2" Width="Auto"
/>
</StackPanel>
</Window>
我们定义一个当按钮被按下时的触发器,当触发器被触发时会改变字体颜色:
针对同一个属性我们可以设置多个触发器,最后的效果以最后定义的触发器为准。
如果我们希望多个属性同时满足条件时才会触发触发器,可以利用MultiTrigger触发器,这种触发器会提供一个Conditions的一个集合,对该集合进行设置属性和满足的条件。
<Window.Resources>
<Style x:Key="style1">
<Style.Setters>
<Setter Property="Control.FontFamily" Value="Times New Roman"></Setter>
<Setter Property="Control.FontSize" Value="32"></Setter>
</Style.Setters>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Control.IsFocused" Value="true"></Condition>
<Condition Property="Control.IsMouseOver" Value="true"></Condition>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Control.Foreground" Value="Red"></Setter>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
我们设置了当按钮被按下,且鼠标要停留在上面才会改变字体颜色的多触发器,效果如下:
2、事件触发器
事件触发器和简单触发器不同的是,事件触发器监视的是某个特定的事件,而不是某个属性。
<Window.Resources>
<Style x:Key="style1">
<Style.Setters>
<Setter Property="Control.FontFamily" Value="Times New Roman"></Setter>
<Setter Property="Control.FontSize" Value="32"></Setter>
</Style.Setters>
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="FontSize" To="80"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="FontSize"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
我们定义一个当鼠标停留在按钮上时更改字体大小的事件触发器,然后鼠标离开时恢复: