我一直在寻找关于“Preview******”事件的描述,比如每个元素都有KeyDown和PreviewKeyDown两个事件,它们之间有什么区别(并不是一个事件已被附加而另一个事件没有,而是真正的传统差异和编程方式上的差异)。
在任何从Control派生的类中,您都可以重写两种方法.. OnKeyDown和OnPreviewKeyDown,现在我正在编写自定义控件,应该使用哪种方法?这两者之间有什么区别。
摘自《Programming WPF - Chris Sells和Ian Griffith》
除了直接事件外,WPF定义大多数路由事件都成对出现 - 一个是隧道事件,另一个是冒泡事件。隧道事件名称总是以“Preview”开头并首先引发。这使得父级有机会在事件到达子级之前看到它。然后是冒泡事件的对应项。在大多数情况下,您只需要处理冒泡事件。预览事件通常用于
- 阻止事件 (
e.Handled = true
)- 导致父级提前执行正常事件处理。
例如,如果UI树= Button包含Grid包含Canvas包含Ellipse,则单击椭圆形会导致(MouseDownButton被Button吃掉,而触发Click事件)。
PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
我在这篇博客文章中找到了一个非常有用的描述区别的内容:
http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/
在可视化树中,当元素上发生事件时,首先会从根向元素传递预览事件(隧道过程):PreviewKeyDown事件将在所有这些元素上引发,并且然后会从元素到根本身传递“普通”事件(冒泡过程)。