前两章学习了 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 事件时. 通常可在同一位置进行所有初始化, 这个位置一般是 Windows.Load 事件的事件处理程序.
二, 输入事件
输入事件是当用户使用某些种类的外设硬件进行交互时发生的事件, 例如鼠标, 键盘, 手写笔或多点触控屏. 输入事件可通过继承自 InputEventArgs 的自定义事件参数类传递额外的信息. 如下图所示, 显示了继承层次.
图 输入事件的 EventArgs 类
InputEventArgs 类只增加了两个属性: Timestamp 和 Device.Timestamp 属性提供了一个整数, 指示事件何时发生的毫秒数(它所代表的实际事件并不重要, 但可比较不同的时间戳值以确定哪个事件先发生. 事件戳值大的事件是在更近发生的).Device 属性返回一个对象, 该对象提供与触发事件的设备相关的更多信息, 设备可以是鼠标, 键盘或手写笔. 这三种可能的设备由不同的类表示, 所有这些类都继承自抽象类 System.Windows.Input.InputDevice.
接下来章节将进一步分析在 WPF 应用程序中如何处理鼠标, 键盘以及多点触控动作.
来源: https://www.cnblogs.com/Peter-Luo/p/12236807.html