在应用程序的生命周期中,用户界面中对象的状态会发生改变。通常以面向用户的术语来表述状态。例如,按钮的“鼠标悬停”状态或菜单项的“按下”状态。这两个示例状态是分别使用 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 语言定义的。有关详细信息,请参阅编写将对事件做出响应的代码。
有关可通过使用触发器或事件处理程序方法挂钩到的事件的列表,请参阅 控件、属性和事件参考。