WPF 触发器 Trigger

触发器 Trigger

触发器(Trigger)是 WPF 中的一种机制:
当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。

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

常见触发器类型:

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


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

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

<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>

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

相关属性:

属性 / 子元素类型说明
PropertyDependencyProperty触发器监听的属性(比如 IsMouseOver
ValueobjectProperty 的值等于这个 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)是否只读
OrientationStackPanel等控件的方向(Horizontal / Vertical)


2. DataTrigger —— 数据变化触发

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

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

<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 事件),让按钮慢慢变大:

<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。

主要属性

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

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

    • 通常用在 ControlTemplateDataTemplate 内。

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


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

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

<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 让触发更有动效比如渐变色、放大缩小动画

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/82106.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/82106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP核心技术解析:大模型与分词工具的协同工作原理

文章目录 一、核心关系概述二、分词工具的核心作用三、未登录词&#xff08;OOV&#xff09;问题3.1 问题本质分析3.2 解决方案3.2.1 预对齐词汇表&#xff08;最优解&#xff09;3.2.2 子词回退策略3.2.3 词汇表扩展&#xff08;适合专业领域&#xff09; 3.3 技术选型建议3.4…

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开

文章目录 VS Code 预览模式如何取消预览模式&#xff08;即“固定”标签页&#xff09;&#xff1f;预览模式有什么用&#xff1f; VS Code 预览模式 在 VS Code 中&#xff0c;当你单击文件浏览器&#xff08;例如&#xff0c;资源管理器侧边栏&#xff09;中的某个文件时&am…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么?

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的&#xff1f; user/_sleep 是什么&#xff1f; book-riscv-rev3.pdf 3.8节有对Xv6 binary文件的格式描述 Xv6 binaries are formatted in the widely-used ELF format, defined in (kernel/elf.h). An …

【AI科技】AMD ROCm 6.4 新功能:突破性推理、即插即用容器和模块化部署,可在 AMD Instinct GPU 上实现可扩展 AI

AMD ROCm 6.4 新功能&#xff1a;突破性推理、即插即用容器和模块化部署&#xff0c;可在 AMD Instinct GPU 上实现可扩展 AI 现代 AI 工作负载的规模和复杂性不断增长&#xff0c;而人们对性能和部署便捷性的期望也日益提升。对于在 AMD Instinct™ GPU 上构建 AI 和 HPC 未来…

【含文档+PPT+源码】基于微信小程序连锁药店商城

项目介绍 本课程演示的是一款基于微信小程序连锁药店商城&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…

node.js模块化步骤(各标准区别)CommonJS规范、AMD规范、UMD规范、ES Modules (ESM)

前后端建议统一使用ESM 文章目录 Node.js模块化发展历程与标准对比一、模块化的意义1.1 解决的核心问题1.2 没有模块化的问题 二、CommonJS规范2.1 核心特征2.2 实现示例 三、AMD (Asynchronous Module Definition)3.1 特点3.2 代码示例 四、UMD (Universal Module Definition)…

人工智能与智能合约:如何用AI优化区块链技术中的合约执行?

引言&#xff1a;科技融合的新风口 区块链和人工智能&#xff0c;是当前最受瞩目的两大前沿技术。一个以去中心化、可溯源的机制重构信任体系&#xff0c;另一个以智能学习与决策能力重塑数据的价值。当这两项技术相遇&#xff0c;会碰撞出什么样的火花&#xff1f; 智能合约作…

RabbitMQ-api开发

前言 MQ就是接收并转发消息 核心概念 admin是用户 每个虚拟机上都有多个交换机 快速入门 引入依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependen…

PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 简介 1.1 核心作用 • 主节点故障检测 Watchdog 会定时检测数据库主节点&#xff08;或 Pgpool 主节点&#xff09;的运行状态。 一旦主节点宕机&#xff0c;它会发起故障切换请求。 • 协调主备切换 多个 Pgpool 节点时&#xff0c;Watchdog 保证只有一个 Pg…

【多种不同提交方式】通过springboot实现与前端网页数据交互(非常简洁快速)

【多种不同提交方式】通过springboot实现与前端网页数据交互 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&am…

使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结

一、前言 AI 发展的如此迅速&#xff0c;有人想通过 AI 提效对视频的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 视频总结的功能&#xff0c;可以解析bilibili网站上部分视频&#xff0c;如下图所示&#xff1a; 但有的视频解析时提示&#xff1a; 所以呢&#x…

鞅与停时 - 一种特别的概率论问题

讨论一个有趣的概率问题&#xff1a; [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题&#xff0c;考虑一直无规律随即打字的猴子&#xff0c;键盘上只有A-Z一共26个字母&#xff0c;对于一个特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层&#xff1a; Data -> Export Data, 按照图示进行选择&#xff0c;选择tiff格式导出即可&#xff0c;还可以选择其他类型的格式&#xff0c;比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判断一个exe是不是c#wpf开发的

在powershell下执行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路径") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-华为机考第三题300分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 城市紧急救援队伍协同规划 问题描述 智慧城市建设中,卢小姐负责设计一套紧急救援队伍协同系统。城市被规划为一个 n n n \times n

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…

jupyter notebook汉化教程

本章教程记录&#xff0c;jupyter notebook汉化步骤&#xff0c;如果对汉化有需求的小伙伴可以看看。 一、安装jupyter 如果你是安装的anaconda的那么默认是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基础python&#xff0c;默认是不包含的jupyter组件的&#x…

模拟设计中如何减小失配

Xx 芯片测试结果显示&#xff0c;offset 指标偏高&#xff0c;不符合指标要求。所以查看了资料&#xff0c;温习了减小的失配的方法。 注意点一&#xff1a; 将所有offet折算到输入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;阈值电压失配直接折算成输…

C++ 与 Lua 联合编程

在软件开发的广阔天地里&#xff0c;不同编程语言各有所长。C 以其卓越的性能、强大的功能和对硬件的直接操控能力&#xff0c;在系统开发、游戏引擎、服务器等底层领域占据重要地位&#xff0c;但c编写的程序需要编译&#xff0c;这往往是一个耗时操作&#xff0c;特别对于大型…

烤箱面包烘焙状态图详解:从UML设计到PlantUML实现

题目&#xff1a;假设你正着手设计一个烤箱。建立一个跟踪烤箱中面包状态的状态图。要包括必要的触发器事件、动作和监视条件。 一、状态图概述 状态图是UML&#xff08;统一建模语言&#xff09;中的一种行为图&#xff0c;它用于描述系统中对象的状态变化以及触发这些变化的…