什么是WPF预览事件?


78

我一直在寻找事件“ Preview ******”的描述,就像每个元素都有事件KeyDown和PreviewKeyDown一样。什么是差异(不是一个附加事件,一个不是,实际的常规差异和编程方式差异)

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

Answers:


124

从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

谢谢,我一直在MSDN中四处寻找,但没有找到它,我读过每个人都在谈论起泡和隧穿的问题,但这种文字的地方到处都没有。
Akash Kava


3

基本上,这是同一事件,但发生在主事件之前。它们存在,因此您可以侦听这些类型的事件,而不会在这些事件发生时干扰控件的正常行为。

例如,单击或单击Enter时按钮会执行操作。如果您自己处理这些事件,则必须确保执行相同的操作,否则按钮将不会起作用。预览事件在同一时间轴上为您提供了一个事件,而不必担心会与现有功能混淆。

在处理自定义样式/触发器/控件模板时,这特别有用。当您开始覆盖控件的外观/行为时。

因此,在您的控件中,执行OnKeyDown事件所需的主要工作,然后将预览事件留给其他人使用,这就是我与他们一起工作的方式。


3

这种差异与路由事件有关,这是WPF实施其事件处理策略的方式。标准事件名称(例如KeyDown等)表示冒泡路由策略。带有“ Preview”(即PreviewKeyDown等)的前缀表示隧道路由策略。您可以在此处详细了解这些策略。基本上,当调用WPF中的事件时,它首先从最顶层的元素向下移动到可视树,再到调用该事件的元素,最后向上返回。在树下,您将遇到PreviewKeyDown事件,而在回程中,您将依次遇到KeyDown事件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.