-
在 WPF(Windows Presentation Foundation)中,触发器是一种机制,用于在满足特定条件时自动更改控件的属性或执行某些操作。它可以基于属性值的变化、事件的发生等来触发。例如,当鼠标移到按钮上(触发鼠标悬停事件)时,按钮的背景色发生变化,这就可以通过触发器来实现。
-
主要有三种类型的触发器:属性触发器(PropertyTrigger)、事件触发器(EventTrigger)和数据触发器(DataTrigger)。
1. 属性触发器
以一个按钮的 【鼠标移动至按钮上方】触发为例
<Window x:Class="Trigger.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<StackPanel Margin="20">
<Button Height="25" Content="sssss">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderBrush="Black" BorderThickness="1" CornerRadius="2">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Button.Template>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="Black"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Black"/>
<Setter Property="Foreground" Value="Yellow"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
</Window>
上述代码中,
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderBrush="Black" BorderThickness="1" CornerRadius="2">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Button.Template>
定义了button控件的模板,因为 WPF中的某些控件(如Button
)使用默认的ControlTemplate
,在ControlTemplate
中可能已显式设置了Background
属性,这会导致触发器中指定的Background
属性没有生效。
运行效果
属性触发器
2. 事件触发器
给按钮设置一个透明度改变的动画,在按钮被点击时触发动画
<Window x:Class="Trigger.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<StackPanel Margin="20">
<Button Name="AnimatedButton" Content="Click Me!" Width="100" Height="50">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Window>
执行效果
事件触发器
3. 数据触发器
假设有一个数据绑定的场景。有一个CheckBox
和一个TextBlock
。当CheckBox
被选中(IsChecked
属性为true
)时,TextBlock
的文字颜色变为LightGreen背景变为Black
3.1 绑定字段
在VM中创建要绑定的字段 ,这里绑定用了Prism框架,需要using Prism.mvvm
using Prism.Mvvm;
namespace Trigger.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private string _title = "PrismApplication";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private bool _isChecked =false;
public bool IsChecked
{
get { return _isChecked; }
set { SetProperty(ref _isChecked, value); }
}
public MainWindowViewModel()
{
}
}
}
3.2 设定数据触发器 并给触发器绑定数据字段
<Window x:Class="Trigger.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<StackPanel Margin="20" HorizontalAlignment="Center">
<CheckBox Content="Select Option" IsChecked="{Binding IsChecked}"/>
<TextBlock Text="Some Text">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked}" Value="true">
<Setter Property="Foreground" Value="LightGreen"/>
<Setter Property="Background" Value="Black"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</Window>
执行效果
数据触发器