我一直在寻找事件“ Preview ******”的描述,就像每个元素都有事件KeyDown和PreviewKeyDown一样。什么是差异(不是一个附加事件,一个不是,实际的常规差异和编程方式差异)
在从Control派生的任何类中,您可以覆盖这两种方法。OnKeyDown和OnPreviewKeyDown,现在我正在编写自定义控件,应使用哪个方法?两者之间有什么不同。
我一直在寻找事件“ Preview ******”的描述,就像每个元素都有事件KeyDown和PreviewKeyDown一样。什么是差异(不是一个附加事件,一个不是,实际的常规差异和编程方式差异)
在从Control派生的任何类中,您可以覆盖这两种方法。OnKeyDown和OnPreviewKeyDown,现在我正在编写自定义控件,应使用哪个方法?两者之间有什么不同。
Answers:
从WPF编程开始-Chris Sells和Ian Griffith
除了直接事件,WPF都是成对定义大多数路由事件-一种是隧道传输,另一种是冒泡。隧道事件名称始终以“预览”开头,并首先引发。这使父母有机会在事件到达孩子之前看到事件。其次是冒泡的对象。在大多数情况下,您将只处理冒泡的东西。预览通常用于
- 阻止事件(
e.Handled = true
)- 使父级提前执行正常事件处理。
例如,如果UI Tree = 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事件,然后是“ normal”事件事件将从元素传播到根(冒泡)。
这种差异与路由事件有关,这是WPF实施其事件处理策略的方式。标准事件名称(例如KeyDown等)表示冒泡路由策略。带有“ Preview”(即PreviewKeyDown等)的前缀表示隧道路由策略。您可以在此处详细了解这些策略。基本上,当调用WPF中的事件时,它首先从最顶层的元素向下移动到可视树,再到调用该事件的元素,最后向上返回。在树下,您将遇到PreviewKeyDown事件,而在回程中,您将依次遇到KeyDown事件。