前两章学习了WPF事件的工作原理,现在分析一下在代码中可以处理的各类事件。尽管每个元素都提供了许多事件,但最重要的事件通常包括以下5类:

  •   生命周期事件:在元素被初始化、加载或卸载时发生这些事件。
  •   鼠标事件:这些事件是鼠标动作的结果。
  •   键盘事件:这些事件是键盘动作(如按下键盘上的键)的结果。
  •   手写笔事件:这些事件是使用类似钢笔的手写笔的结果。在平板电脑上用手写笔代替鼠标。
  •   多点触控事件:这些事件是一根或多根手指在多点触控屏上触摸的结果。尽在Windows7中支持这些事件。

一、生命周期事件

  当首次创建以及释放所有元素时都会引发事件,可使用这些事件初始化窗口。表1-1列出了这些事件,他们是在FrameworkElement类中定义的。

表1-1 所有元素的生命周期事件

  为了弄清Initialized事件和Loaded事件之间的关系,分析一下呈现过程是有帮助的。FrameworkElement类实现了ISupportInitialize接口,该接口提供了两个用于控制初始化过程的方法。第一个方法是BeginInit(),在实例化元素后立即调用该方法。调用BeginInit()方法后,XAML解析器设置所有元素的属性(并添加内容)。第二个方法是EndInit(),完成初始化后,将调用该方法,此时引发Initialized事件。

  当创建窗口时,会自下而上地初始化每个元素分支。这意味着,位于深层的嵌套元素在他们的容器之前被初始化。当引发初始化事件时,可确保元素树中当前元素以下的元素已经全部完成了初始化。但是,包含当前元素的元素可能还没有初始化,并且不能假定窗口的任何其他部分已经初始化。

  在每个元素都完成初始化后,还需要在他们的容器中进行布局、应用样式。如果需要的话,还会绑定到数据源。当引发窗口的Initialized事件后,就可以进入下一阶段了。

  一旦完成初始化过程,就会引发Loaded事件。Loaded事件和Initialized事件的发生过程相反——换句话说,包含其他所有元素的窗口首先引发Loaded事件,然后才是更深层的嵌套元素。为所有元素都引发了Loaded事件后,窗口就变得可见了,并且元素都已被呈现。

  窗口还有它自己更特殊的生命周期事件,表1-2列出了这些事件。

表1-2 Windows类的生命周期事件

  如果只对执行控件的第一次初始化感兴趣,完成这项任务的最好时机是在触发Loaded事件时。通常可在同一位置进行所有初始化,这个位置一般是Window.Load事件的事件处理程序。

二、输入事件

  输入事件是当用户使用某些种类的外设硬件进行交互时发生的事件,例如鼠标、键盘、手写笔或多点触控屏。输入事件可通过继承自InputEventArgs的自定义事件参数类传递额外的信息。如下图所示,显示了继承层次。

图 输入事件的EventArgs类

  InputEventArgs类只增加了两个属性:Timestamp和Device。Timestamp属性提供了一个整数,指示事件何时发生的毫秒数(它所代表的实际事件并不重要,但可比较不同的时间戳值以确定哪个事件先发生。事件戳值大的事件是在更近发生的)。Device属性返回一个对象,该对象提供与触发事件的设备相关的更多信息,设备可以是鼠标、键盘或手写笔。这三种可能的设备由不同的类表示,所有这些类都继承自抽象类System.Windows.Input.InputDevice.

  接下来章节将进一步分析在WPF应用程序中如何处理鼠标、键盘以及多点触控动作。

【WPF学习】第十五章 WPF事件的更多相关文章

  1. 【WPF学习】第五十四章 关键帧动画

    到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...

  2. 【WPF学习】第五十七章 使用代码创建故事板

    在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...

  3. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  4. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...

  5. C++ Primer Plus学习:第十五章

    第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后 ...

  6. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  7. Gradle 1.12 翻译——第十五章. 任务详述

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  8. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. Python涉及的各个领域以及技术应用

    WEB开发 完全主义者高效率框架Django 异步高并发Tornado框架 短小精悍Flask,Bottle框架 网络编程 高并发Twisted网络框架 Python3引入的asyncio异步编程 爬 ...

  2. PowerShell 通过 WMI 获取系统信息

    本文告诉大家如何通过 WMI 使用 Win32_OperatingSystem 获取设备厂商 通过下面代码可以获取 系统版本和系统是专业版还是教育版 Get-WmiObject Win32_Opera ...

  3. 什么是激励函数 (Activation Function)

    relu sigmoid tanh 激励函数. 可以创立自己的激励函数解决自己的问题,只要保证这些激励函数是可以微分的. 只有两三层的神经网络,随便使用哪个激励函数都可以. 多层的不能随便选择,涉及梯 ...

  4. vue学习笔记(二)vue的生命周期和钩子函数

    前言 通过上一章的学习,我们已经初步的了解了vue到底是什么东西,可以干什么,而这一篇博客主要介绍vue的生命周期和它常用的钩子函数,如果有学过java的园友可能有接触到在学习servlet的时候学过 ...

  5. select * from user 这条 SQL 语句,背后藏着哪些不可告人的秘密?

    作为一名 Java开发人员,写 SQL 语句是常有的事,但是你知道 SQL 语句背后的处理逻辑吗?比如下面这条 SQL 语句: select * from user where id=1 执行完这条语 ...

  6. 开发板免费领!腾讯云IoT应用创新大赛正式启动!

    大赛简介 腾讯云IoT应用创新大赛是腾讯云面向物联网领域举办的大型竞赛,通过腾讯云IoT全链路产品能力,开放平台和服务,与广大开发者共同创新,孵化优秀的IoT产品和解决方案,共同构建IoT应用生态. ...

  7. Google Vision OCR

    Google Vision OCR 爬坑建议 首先安装 Google Vision shell composer require google/cloud-vision 第一次使用的时候真的遇到的问题 ...

  8. 20191024-2 Alpha阶段贡献分配

    此作要求参见: https://edu.cnblogs.com/campus/nenu/2019fall/homework/9858 要求1 每位组员的贡献分值 罗杨美慧:9 徐丽君:11 魏鑫:12 ...

  9. CF1272D. Remove One Element 题解 动态规划

    题目链接:http://codeforces.com/contest/1272/problem/D 题目大意: 给你一个长度为 \(n\) 的数组,你最多删除一个元素(也可以不删),求此条件限制下的最 ...

  10. [转]C#中的abstract 类和方法

    转:https://www.cnblogs.com/zzy2740/archive/2005/09/20/240808.html C#中的abstract类不能被实例化,他只提供其他类的继承的接口 u ...