使用触发器定义 WPF 控件的行为
在应用程序的生命周期中,用户界面中对象的状态会发生改变。通常以面向用户的术语来表述状态。例如,按钮的“鼠标悬停”状态或菜单项的“按下”状态。这两个示例状态是分别使用 UIElement.IsMouseOver 属性和 MenuItem.IsPressed 属性在对象上实现的。
但对用户而言,这些属性的值及其代表的状态不是可见的。 IsMouseOver 和 IsPressed 都不是可视属性。为了观察这些属性,非可视属性的更改必须触发可视属性(如 Background 或 Opacity )的更改。例如,原本平整的按钮会在变为“鼠标悬停”状态后凹下去;菜单项也会在“按下”时更改背景颜色。
除了更改状态以外,对象还会引发事件。例如,当指针越过按钮边界时,将引发 MouseEnter 和 MouseLeave 事件。同样地,事件本身也没有可视外观,因此它必须触发可视属性的更改,才能被用户注意到。
可以在文档的根元素中或者在应用于控件的样式中创建触发器(和动画时间线)。例如,可以修改按钮的样式,以便在按钮的“按下”和“变换”状态更改时,按钮的外观能发生细微变化。应用了该样式的任何按钮都会有相同的行为。有关示例,请参阅动手试验:向按钮添加动画。
有两种触发器:
属性触发器 通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。
事件触发器 通过此机制,事件会在属性中触发动态更改。
下图显示了触发器用户界面,其中包含两个属性触发器( IsMouseOver 和 IsPressed )以及一个事件触发器 ( target-element.Loaded )。 IsMouseOver 属性触发器处于选定状态,表示已更改的属性 ( Border.Background ) 和触发的时间线 ( OnLoaded1 )。
有关使用触发器的示例,请参阅在 WPF 控件中添加或删除触发器和创建简单动画。
属性触发器
属性触发器将定义触发“条件” 以及满足该条件时应该执行的操作。“button1 的 IsMouseOver 属性为 true”便是一个条件示例。操作的示例包括“将 button1 的 Foreground 属性设置为 Red 和开始运行名为 Expand 的动画以将按钮放大”。
“将 Foreground 设置为 Red”是一种名为“属性资源库” 操作的示例。设置器仅在满足条件时才会生效;如果不再满足条件,该属性将还原为以前的值。“开始运行名为 Expand 的动画”是 进入操作 的一个示例;该操作将在满足条件时执行。如果不再满足条件,则执行 退出操作 。进入或退出操作只可以控制动画。下图显示了此属性触发器示例的生命周期。
请注意,资源库可在其整个生命周期中控制 Foreground 属性。到第 5 阶段时, Foreground 将再次自动设置回 Black。但是,由进入操作执行的任何属性动画都不会撤消。到第 5 阶段时,按钮仍然放到为一个较大的大小。该解决方案旨在设计一个 Contract 动画以便再次缩小按钮,然后在退出操作中开始运行此新动画。
只能在样式或模板中定义属性触发器,不过通常对于触发器而言,最佳做法是尽可能将属性触发器放到模板中。
事件触发器
事件触发器定义了触发条件以及满足该条件时应该执行的操作。“在引发 button1 的 MouseEnter 事件时”便是一个条件示例。操作的示例包括“开始运行名为 Expand 的动画以将按钮放大”。
示例操作与前面在属性触发器示例中使用的进入操作相同。事件触发器与属性触发器的生命周期不同,它仅运行操作来响应事件。因此,事件触发器没有进入操作和退出操作之分,而只有操作。
如果希望在指针进入按钮边界时放大按钮,然后在指针离开其边界时还原到正常大小,则必须定义一对可运行互补缩放动画的事件触发器。可以在样式、模板或 LayoutRoot 中定义事件触发器。
使用属性触发器还是事件触发器?
通常,一个属性与一组相应的事件相对应,您可以决定是设计一个属性触发器,还是设计两个事件触发器。例如,可以使用 IsMouseOver 属性触发器,或者成对使用 MouseEnter 和 MouseLeave 事件触发器来实现相同的效果。应尽可能使用属性触发器,而在不得不使用事件触发器时才使用它(例如,未使用样式或模板时)。在确实需要使用事件触发器时,为了补偿缺少的设置器,可以创建一对在 0 秒处包含关键帧的动画。
使用触发器还是事件处理程序方法?
使用事件处理程序不仅能完成触发器可以执行的所有任务,而且还可以添加其他任何编程逻辑,例如,设置另一个元素的属性、加载新文档、创建新元素等。这是因为事件处理程序方法是在文档的代码隐藏文件中以 C# 或 Microsoft Visual Basic .NET 语言定义的。有关详细信息,请参阅编写将对事件做出响应的代码。
有关可通过使用触发器或事件处理程序方法挂钩到的事件的列表,请参阅 控件、属性和事件参考。
另请参阅
任务
Microsoft Corporation 版权所有 ⓒ 2011。保留所有权利。
使用触发器定义 WPF 控件的行为的更多相关文章
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- WPF控件模板
引言:在进行WPF项目开发过程中,由于项目的需要,经常要对某个控件进行特殊的设定,其中就牵涉到模板的相关方面的内容.本文也是在自己进行项目开发过程中遇到控件模板设定时集中搜集资料后整理出来的,以供在以 ...
- 跟我一起学WPF(2):WPF控件基础
WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...
- 浅尝辄止——使用ActiveX装载WPF控件
1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...
- 在WinForm应用程序中嵌入WPF控件
我们知道,在WPF界面上添加WinForm的控件需要使用WindowsFormHost类.而在WinForm界面上添加WPF控件该如何做呢?有没有类似的类呢?明显是有的,ElementHost就是为了 ...
- WPF 控件库——仿制Windows10的进度条
WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...
- WPF 控件库——带有惯性的ScrollViewer
WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- 6 WPF控件
WPF控件分类: 内容控件 标题内容控件 文本控件 列表控件 基于范围的控件 日期控件 控件类 控件是与用户交互的元素.控件可以获得焦点,能接受键盘或鼠标的输入. 所有控件的基类是System.Win ...
随机推荐
- Eclipse git pull 报Nothing to fetch 异常原因
eclipse git pull 报错 // 使用这个配置就可以正常pull了 [core] symlinks = false repositoryform ...
- pta 习题集5-17 哥尼斯堡的“七桥问题”
哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-1783)最终解决 ...
- 南京网络赛J-Sum【数论】
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- SQL---->mySQl数据库1------表的增删改查
一.创建表(增) 二.删除表(删) drop table 表名; 三.修改表(改) 3.1修改表——>增加一列 3.2修改表——>修改列的值 3.3修改表——>删除列 3.4修改表— ...
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)
A. k-rounding 题目意思:给两个数n和m,现在让你输出一个数ans,ans是n倍数且末尾要有m个0; 题目思路:我们知道一个数末尾0的个数和其质因数中2的数量和5的数量的最小值有关系,所以 ...
- backend community-driven web framework
kataras/iris: The fastest backend community-driven web framework on (THIS) Earth. HTTP/2, MVC and mo ...
- php array_merge和运算符+
其实很多时候我都很疑惑为什么同维度的数组不能直接使用运算+直接进行相加,然后结果就是两个数组合并的在一起的新结果,这个就有点跟array_merge合并函数类似了,接下来就来看下这两种合并的方式到底有 ...
- 小米范工具系列之六:小米范 web查找器2.x版本发布
小米范web查找器是一款快速识别端口及服务的小工具. 此工具使用java 1.8以上版本运行. 下载地址:http://pan.baidu.com/s/1c1NDSVe 文件名web finder ...
- python获取当天日期进行格式转换
# Python Library import time def getToday(format=3): """返回今天的日期字串""" # ...
- 邮件服务器Postfix的管理 重启php-fpm
Postfix邮件系统安装与配置:Postfix,Cyrus-IMAP,Cyrus-sasl,Dovecot和SPFhttp://www.freehao123.com/postfix-cyrus/Ce ...