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. 10.Curator队列

        Curator也提供ZK Recipe的分布式队列实现.利用ZK的 PERSISTENTSEQUENTIAL节点,可以保证放入到队列中的项目是按照顺序排队的.如果单一的消费者从队列中取数据,那 ...

  2. MVC视图布局页常用代码

    1.在视图 Views 中新建文件夹  Shared 2.在 Shared 中新建布局页-母版页   _Layout.cshtml @{ Layout = null; } <!DOCTYPE h ...

  3. SpringIoc的精彩讲解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  4. Python大数据:信用卡逾期分析

    # -*- coding:utf-8 -*- # 数据集成 import csv import numpy as np import pandas as pd import matplotlib.py ...

  5. flight framework 核心解读

    http://blog.csdn.net/sky_zhe/article/details/38906689?utm_source=tuicool&utm_medium=referral

  6. supervisor - Python进程管理工具(转)

    add by zhj: 下面是在ubuntu上的一些使用经验 1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. s ...

  7. Mysql中datetime和timestamp区别

    DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...

  8. (2.14)Mysql之SQL基础——游标

    (2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...

  9. 前端 html span标签

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. js-template-art【四】通过helper方法注册,调用外部方法

    一.语法 模板代码中调用外部函数,需要通过helper方法注册 template.helper(name, callback) 二.使用[实例] 原文:http://blog.csdn.net/u01 ...