WPF预览事件是什么?

89

我一直在寻找关于“Preview******”事件的描述,比如每个元素都有KeyDown和PreviewKeyDown两个事件,它们之间有什么区别(并不是一个事件已被附加而另一个事件没有,而是真正的传统差异和编程方式上的差异)。

在任何从Control派生的类中,您都可以重写两种方法.. OnKeyDown和OnPreviewKeyDown,现在我正在编写自定义控件,应该使用哪种方法?这两者之间有什么区别。

4个回答

133

摘自《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

谢谢,我在 MSDN 上找了很久都没找到,我看了所有人都在谈论冒泡和隧道,但这段文字却无处可见。 - Akash Kava

10

我在这篇博客文章中找到了一个非常有用的描述区别的内容:

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

在可视化树中,当元素上发生事件时,首先会从根向元素传递预览事件(隧道过程):PreviewKeyDown事件将在所有这些元素上引发,并且然后会从元素到根本身传递“普通”事件(冒泡过程)。


4
这个差异与路由事件有关,这是WPF实现其事件处理策略的方式。标准事件名称(即KeyDown等)意味着冒泡路由策略。以“Preview”为前缀的事件(即PreviewKeyDown等)则表示隧道路由策略。你可以在这里详细了解这些策略。基本上,在WPF中调用事件时,它首先从最顶层的元素向下遍历视觉树,直到调用事件的元素,然后最终返回。在向下遍历树的过程中,你将遇到PreviewKeyDown事件,在返回行程中,你将按照顺序遇到KeyDown事件。

3
基本上,它是相同的事件,但发生在主要事件之前。 它们存在的目的是,当这些事件发生时,您可以听取这些类型的事件而不会干扰控件的正常行为。
例如,按钮在单击或MouseEnter等操作时会执行某些操作。 如果您自己处理这些事件,则必须确保执行相同的操作,否则您的按钮将无法以相同的方式运行。 预览事件在相同的时间轴中为您提供了一个事件,而无需担心破坏现有功能。
这在处理自定义样式/触发器/控件模板时非常有用。 当您开始覆盖控件外观/行为时。
因此,在您的控件中,通过OnKeyDown事件执行您想要的主要工作,并将预览事件留给其他人使用,这就是我使用它们的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接