WPF 触发器 Trigger

触发器 Trigger

触发器(Trigger)是 WPF 中的一种机制:

当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。

换句话说,就是"如果......那么就......" 的一种规则。

常见触发器类型:

类型 说明
Trigger 依赖属性变化时触发
DataTrigger 绑定的数据变化时触发
EventTrigger 事件发生时触发
MultiTrigger 多个条件同时满足时触发
MultiDataTrigger 多个数据条件同时满足时触发

1. Trigger ------ 属性值触发(最基础)

例如,当按钮被鼠标悬停(IsMouseOver = true)时,改变背景色:

xml 复制代码
<Button Content="鼠标悬停变色">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True"> <!--Is... 触发条件-->
                    <Setter Property="Background" Value="LightGreen"/>
                    <Setter Property="Foreground" Value="DarkBlue"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

✅ 效果:鼠标悬停到按钮上时,按钮背景变绿、文字变蓝。

相关属性:

属性 / 子元素 类型 说明
Property DependencyProperty 触发器监听的属性(比如 IsMouseOver
Value object Property 的值等于这个 Value 时触发
Setters 集合(Setter 满足条件后要应用的一组属性修改(比如改颜色、改大小)
EnterActions 集合(TriggerAction 当进入触发状态时执行的动作(比如动画)
ExitActions 集合(TriggerAction 当离开触发状态时执行的动作

常用条件:

属性触发器(PropertyTrigger)常用条件:

属性名 说明
IsMouseOver 鼠标悬停在控件上时为 True
IsPressed 按钮等控件被按下时为 True
IsEnabled 控件是否启用(禁用时为 False
IsFocused 控件是否获得焦点(获取为 True)
IsChecked 复选框(CheckBox)、单选按钮(RadioButton)是否选中
IsSelected 列表项(ListBoxItem、TabItem等)是否被选中
Visibility 控件是否可见(Visible / Hidden / Collapsed)
IsReadOnly 文本框(TextBox)是否只读
Orientation StackPanel等控件的方向(Horizontal / Vertical)

2. DataTrigger ------ 数据变化触发

当绑定的数据满足某条件时,触发样式改变。

例子:如果按钮绑定的某个值是 "危险",就变成红色。

xml 复制代码
<Button Content="按钮" Tag="危险">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="危险">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Tag 属性是 "危险" 时,按钮背景变红。

常用条件

DataTrigger 用于根据绑定到的数据(DataContext)变化触发,比如:

绑定属性 说明
自定义属性值 比如某个 ViewModel 中的 Status == "完成"
布尔型标志 比如 IsLoading == true
数值型、字符串型比较 比如 Level > 5(需要结合 Converter 实现)

3. EventTrigger ------ 事件发生时触发动作(一般配合动画)

例子:当按钮加载完毕(Loaded 事件),让按钮慢慢变大:

xml 复制代码
<Button Content="加载放大按钮">
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Loaded">
            <BeginStoryboard> <!--动画-->
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Width"
                                     From="100" To="200" Duration="0:0:2"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>

✅ 效果:按钮出现后,2秒内宽度从100变到200。

主要属性

属性 / 子元素 类型 说明
RoutedEvent RoutedEvent 类型 要监听的事件(比如 Button.ClickEvent
SourceName string(可选) 指定事件来源控件的名字(通常用于模板中)
Actions 集合(TriggerAction 事件触发时要执行的动作,通常是开始动画(BeginStoryboard
  1. RoutedEvent:必填!指定要监听哪个路由事件。
xml 复制代码
<!--当按钮被点击时触发。-->
<EventTrigger RoutedEvent="Button.Click">
  1. SourceName:(可选)指定事件来源控件的名字

    • 如果要监听的事件是来自模板中另一个控件,需要指定它的 x:Name

    • 通常用在 ControlTemplateDataTemplate 内。

xml 复制代码
<!--监听名为 `InnerBorder` 的元素的鼠标进入事件。-->
<EventTrigger RoutedEvent="MouseEnter" SourceName="InnerBorder">
  1. Actions:当事件发生时执行的动作。
    • BeginStoryboard:开始一个动画
    • StopStoryboard:停止一个动画
    • PauseStoryboard:暂停动画
    • ResumeStoryboard:恢复动画
xml 复制代码
<!--当事件触发时,执行透明度变化动画。-->
<BeginStoryboard>
    <Storyboard>
        <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.5" Duration="0:0:0.3"/>
    </Storyboard>
</BeginStoryboard>

4. MultiTrigger ------ 多属性同时满足触发

例子:按钮被禁用(IsEnabled = False)且鼠标悬停时,背景变灰:

xml 复制代码
<Button Content="多条件触发按钮" IsEnabled="False">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                        <Condition Property="IsEnabled" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" Value="Gray"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

✅ 效果:按钮同时满足两种状态,才改变样式。

相关属性

属性/子元素 类型 说明
Conditions 集合(Condition 定义多个条件,必须全部同时满足才触发
Setters 集合(Setter 满足条件后要改变的属性
EnterActions(可选) 集合(TriggerAction 进入触发状态时执行的动作(如动画)
ExitActions(可选) 集合(TriggerAction 离开触发状态时执行的动作
使用小技巧 说明
尽量用 Style 包裹触发器 让界面更整洁、好维护
配合 ControlTemplate 自定义控件外观时,触发器更强大
Storyboard 让触发更有动效 比如渐变色、放大缩小动画
相关推荐
beyond谚语14 小时前
第四章 依赖项属性
wpf
国服第二切图仔21 小时前
鸿蒙应用开发之实现键值型数据库跨设备数据同步
数据库·wpf·harmonyos
玖笙&1 天前
✨WPF编程进阶【7.1】动画基础
c++·c#·wpf·visual studio
专注VB编程开发20年1 天前
探讨vs2022在net6框架wpf界面下使用winform控件
framework·.net·wpf·winform·cefsharp·miniblink·geckofx45
刘一说1 天前
Spring Boot 中的定时任务:从基础调度到高可用实践
spring boot·后端·wpf
FuckPatience2 天前
WPF 获取鼠标相对于控件的坐标信息,控制控件锚点放缩
wpf
兰雪簪轩2 天前
仓颉Actor模型:分布式并发编程的优雅之道
分布式·wpf
Crazy Struggle2 天前
WPF 如何支撑一个灵活的流程图编辑器?
.net·wpf·流程图
西岭千秋雪_3 天前
Zookeeper实现分布式锁
java·分布式·后端·zookeeper·wpf
beyond谚语4 天前
第三章 布局
wpf