WPF中的事件(Event)

     UIElement定义核心子系统,包括 Layout、Input 和 Event。

     输入是作为内核模式设备驱动程序上的信号发出的,并通过涉及 Windows 内核和 User32 的复杂进程路由到正确的进程和线程。与输入相对应的 User32 消息一旦路由到 WPF,它就会转换为 WPF 原始输入消息,并发送到调度程序。WPF 允许原始输入事件转换为多个实际事件,允许在保证传递到位的情况下在较低的系统级别实现类似“MouseEnter”的功能。

每个输入事件至少会转换为两个事件 – “预览”事件和实际事件。WPF 中的所有事件都具有通过元素树路由的概念。如果事件从目标向上遍历树直到根,则被称为“冒泡”,如果从根开始向下遍历到目标,它们被称为“隧道”。输入预览事件隧道,使树中的任何元素都有机会筛选事件或对事件采取操作。然后,常规(非预览)事件将从目标向上冒泡到根。

路由事件(Routed Event)

     可以从功能或实现的角度来考虑路由事件。此处对这两种定义均进行了说明,因为用户当中有的认为前者更有用,而有的则认为后者更有用。

     功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。

     实现定义:路由事件是一个 CLR 事件,可以由RoutedEvent类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。

     典型的 WPF 应用程序中包含许多元素。无论这些元素是在代码中创建的还是在 XAML 中声明的,它们都由共同所在的元素树关联起来。根据事件的定义,事件路由可以按两种方向之一传播,但是通常会在元素树中从源元素向上“冒泡”,直到它到达元素树的根(通常是页面或窗口)。

路由策略

     路由事件使用以下三个路由策略之一:

     冒泡:针对事件源调用事件处理程序。路由事件随后会路由到后续的父元素,直到到达元素树的根。大多数路由事件都使用冒泡路由策略。冒泡路由事件通常用来报告来自不同控件或其他 UI 元素的输入或状态变化。

     直接:只有源元素本身才有机会调用处理程序以进行响应。这与 Windows 窗体用于事件的“路由”相似。但是,与标准 CLR 事件不同的是,直接路由事件支持类处理(类处理将在下一节中介绍)而且可以由 EventSetterEventTrigger 使用。

     隧道:最初将在元素树的根处调用事件处理程序。随后,路由事件将朝着路由事件的源节点元素(即引发路由事件的元素)方向,沿路由线路传播到后续的子元素。在合成控件的过程中通常会使用或处理隧道路由事件,这样,就可以有意地禁止显示复合部件中的事件,或者将其替换为特定于整个控件的事件。在 WPF 中提供的输入事件通常是以隧道/冒泡对实现的。隧道事件有时又称作 Preview 事件,这是由隧道/冒泡对所使用的命名约定决定的。

预览事件

     预览事件(也称为隧道事件)是路由事件,以Preview最为前缀。路由的方向是从应用程序根元素到引发该事件并在事件数据中报告为源的元素。

将路由事件标记为“已处理”和“类处理”

     路由事件的处理程序可以在事件数据内将事件标记为已处理。处理事件将有效地缩短路由。类处理是一个编程概念,受路由事件支持。类处理程序有机会在类级别使用处理程序处理特定路由事件,该处理程序在类的任何实例上的任何实例处理程序之前调用。

事件的处理

     当需要在某个元素停止路由时,需要将该事件的参数标记为已处理。如:e.handled = true;

msdn: http://msdn.microsoft.com/zh-cn/library/ms742806.aspx

http://tech.ddvip.com/2008-09/122232996970810.html

 

 

 

posted @ 2008-11-24 14:53  bluealarm  阅读(3880)  评论(0编辑  收藏  举报