触发器概述

此页仅适用于 WPF 项目

Cc294856.alert_note(zh-cn,Expression.10).gif说明:

Microsoft Silverlight 1.0 或 Silverlight 2 项目中不支持触发器。Silverlight 1.0 应用程序中的所有用户交互都是通过使用事件处理程序来完成的。有关示例,请参阅在 Silverlight 应用程序中创建控制 Storyboard 的按钮。Silverlight 2 应用程序中的用户交互可使用事件处理程序或状态来完成。有关详细信息,请参阅更改用户交互的响应状态

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

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

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

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

有两种触发器:

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

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

下图显示了触发器用户界面,其中包含两个属性触发器(IsMouseOverIsPressed)和一个事件触发器(target-element.Loaded)。已选定 IsMouseOver 属性触发器,并显示已更改的属性 (Border.Background) 和已触发的时间线 (OnLoaded1)。

Cc294856.796fe3b0-6e25-43eb-aed6-2ac834fe40e4(zh-cn,Expression.10).png

有关使用触发器的示例,请参阅添加或删除触发器创建简单动画

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

属性触发器

属性触发器将定义触发条件 以及满足该条件时应该执行的操作。“当 button1 的 IsMouseOver 属性为 true 时”便是一个条件示例。操作的示例包括“将 button1 的 Foreground 属性设置为 Red”和“开始运行名为 Expand 的动画以将按钮放大”。

“将 Foreground 设置为 Red”是一种名为“属性设置器”的操作的示例。设置器仅在满足条件时才会生效;如果不再满足条件,该属性将还原为以前的值。“开始运行名为 Expand 的动画”是进入操作 的一个示例;该操作将在满足条件时执行。如果不再满足条件,则执行退出操作。进入或退出操作只可以控制动画。下图显示了此属性触发器示例的生命周期。

Cc294856.e82c8455-215e-49da-954f-f1bb73d84af2(zh-cn,Expression.10).png

请注意,设置器可在其整个生命周期中控制 Foreground 属性。到第 5 阶段时,Foreground 将再次自动设置回 Black。但是,由进入操作执行的任何属性动画都不会撤消。到第 5 阶段时,按钮仍然放到为一个较大的大小。该解决方案旨在设计一个 Contract 动画以便再次缩小按钮,然后在退出操作中开始运行此新动画。

只能在样式或模板中定义属性触发器,不过通常对于触发器而言,最佳做法是尽可能将属性触发器放到模板中。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

事件触发器

事件触发器定义了触发条件以及满足该条件时应该执行的操作。“在引发 button1 的 MouseEnter 事件时”便是一个条件示例。操作的示例包括“开始运行名为 Expand 的动画以将按钮放大”。

示例操作与前面在属性触发器示例中使用的进入操作相同。事件触发器与属性触发器的生命周期不同,它仅运行操作来响应事件。因此,事件触发器没有进入操作和退出操作之分,而只有操作。

如果希望在指针进入按钮边界时放大按钮,然后在指针离开其边界时还原到正常大小,则必须定义一对可运行互补缩放动画的事件触发器。可以在样式、模板或 LayoutRoot 中定义事件触发器。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

使用属性触发器还是事件触发器?

通常,一个属性与一组相应的事件相对应,您可以决定是设计一个属性触发器,还是设计两个事件触发器。例如,可以使用 IsMouseOver 属性触发器,或者成对使用 MouseEnter 和 MouseLeave 事件触发器来实现相同的效果。应尽可能使用属性触发器,而在不得不使用事件触发器时才使用它(例如,未使用样式或模板时)。在确实需要使用事件触发器时,为了补偿缺少的设置器,可以创建一对在 0 秒处包含关键帧的动画。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

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

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

有关可通过使用触发器或事件处理程序方法挂钩到的事件的列表,请参阅 WPF 事件快速参考

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

另请参见

概念

运行 Storyboard 时进行控制