Expression Studio 4.0
 
此主题尚未评级 - 评价此主题
 

在应用程序的生命周期中,用户界面中对象的状态会发生改变。通常以面向用户的术语来表述状态。例如,按钮的“鼠标悬停”状态或菜单项的“按下”状态。这两个示例状态是分别使用 UIElement.IsMouseOver 属性和 MenuItem.IsPressed 属性在对象上实现的。

但对用户而言,这些属性的值及其代表的状态不是可见的。 IsMouseOverIsPressed 都不是可视属性。为了观察这些属性,非可视属性的更改必须触发可视属性(如 BackgroundOpacity )的更改。例如,原本平整的按钮会在变为“鼠标悬停”状态后凹下去;菜单项也会在“按下”时更改背景颜色。

除了更改状态以外,对象还会引发事件。例如,当指针越过按钮边界时,将引发 MouseEnterMouseLeave 事件。同样地,事件本身也没有可视外观,因此它必须触发可视属性的更改,才能被用户注意到。

可以在文档的根元素中或者在应用于控件的样式中创建触发器(和动画时间线)。例如,可以修改按钮的样式,以便在按钮的“按下”和“变换”状态更改时,按钮的外观能发生细微变化。应用了该样式的任何按钮都会有相同的行为。有关示例,请参阅动手试验:向按钮添加动画

有两种触发器:

  • 属性触发器    通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。

  • 事件触发器    通过此机制,事件会在属性中触发动态更改。

下图显示了触发器用户界面,其中包含两个属性触发器( IsMouseOverIsPressed )以及一个事件触发器 ( 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 属性触发器,或者成对使用 MouseEnterMouseLeave 事件触发器来实现相同的效果。应尽可能使用属性触发器,而在不得不使用事件触发器时才使用它(例如,未使用样式或模板时)。在确实需要使用事件触发器时,为了补偿缺少的设置器,可以创建一对在 0 秒处包含关键帧的动画。

使用触发器还是事件处理程序方法?

使用事件处理程序不仅能完成触发器可以执行的所有任务,而且还可以添加其他任何编程逻辑,例如,设置另一个元素的属性、加载新文档、创建新元素等。这是因为事件处理程序方法是在文档的代码隐藏文件中以 C# 或 Microsoft Visual Basic .NET 语言定义的。有关详细信息,请参阅编写将对事件做出响应的代码

有关可通过使用触发器或事件处理程序方法挂钩到的事件的列表,请参阅 控件、属性和事件参考

另请参阅

Microsoft Corporation 版权所有 ⓒ 2011。保留所有权利。

使用触发器定义 WPF 控件的行为的更多相关文章

  1. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  2. WPF控件模板

    引言:在进行WPF项目开发过程中,由于项目的需要,经常要对某个控件进行特殊的设定,其中就牵涉到模板的相关方面的内容.本文也是在自己进行项目开发过程中遇到控件模板设定时集中搜集资料后整理出来的,以供在以 ...

  3. 跟我一起学WPF(2):WPF控件基础

    WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...

  4. 浅尝辄止——使用ActiveX装载WPF控件

    1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...

  5. 在WinForm应用程序中嵌入WPF控件

    我们知道,在WPF界面上添加WinForm的控件需要使用WindowsFormHost类.而在WinForm界面上添加WPF控件该如何做呢?有没有类似的类呢?明显是有的,ElementHost就是为了 ...

  6. WPF 控件库——仿制Windows10的进度条

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  7. WPF 控件库——带有惯性的ScrollViewer

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  8. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  9. 6 WPF控件

    WPF控件分类: 内容控件 标题内容控件 文本控件 列表控件 基于范围的控件 日期控件 控件类 控件是与用户交互的元素.控件可以获得焦点,能接受键盘或鼠标的输入. 所有控件的基类是System.Win ...

随机推荐

  1. debug kibana in chrome

    kibana5.6.5版本 在kibana根目录运行命令:NODE_OPTIONS='--inspect --debug' npm start 也可以尝试命令:NODE_OPTIONS="- ...

  2. Python爬虫基础(一)urllib2库的基本使用

    爬虫也就是所谓的网络数据采集,是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式.最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表 ...

  3. Scala简介及基础语法

    一.scala简介 官网:https://www.scala-lang.org/ Scala语言很强大,集成了面向对象和函数式编程的特点. 运行在JVM(jdk). 大数据中为什么学习scala? s ...

  4. 人人网张铁安:Feed系统架构分析(转)

    原文:http://www.csdn.net/article/2010-07-26/277273 继成功举办首期TUP活动后,日前在北京丽亭华苑酒店鸿运二厅,由CSDN和<程序员> 杂志联 ...

  5. Day21 过滤器(Filter)

    day21     过滤器(Filter) 过滤器概述   1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个 ...

  6. (2.4)DDL增强功能-数据汇总grouping、rollup、cube

    参考:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 1.rollup (1)rollup在group by 子句中使用 ...

  7. python 定义类 学习2

    构造函数的变量 也叫做 实例变量 class role(): # 传参数 def __init__(self,name,role,weapon,life_value=100,moneny=15000) ...

  8. [Axiom 3D]2.Axiom 基本概念

    1.Root Root 对象是一个 Ogre 应用程序的主入口点.因为它是整个 Ogre 引擎的外观(Façade )类(请参考设计模式中的外观模式),所以在这里作为第一个被列出来的类,它提供了方便的 ...

  9. EasyUI Progressbar 进度条

    通过 $.fn.progressbar.defaults 重写默认的 defaults. 进度条(progressbar)提供了一种显示长时间操作进度的反馈.进度可被更新以便让用户知道当前正在执行的操 ...

  10. PAT 1142 Maximal Clique[难]

    1142 Maximal Clique (25 分) A clique is a subset of vertices of an undirected graph such that every t ...