什么是WPF预览事件?

我一直在寻找事件的描述“预览******”就像每个元素都有事件KeyDown和PreviewKeyDown。 有什么不同(不是一个是附加事件,一个不是,真正的传统差异和编程方式的区别)

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

从编程WPF – 克里斯Sells和伊恩格里菲斯

除了直接事件,WPF定义了大部分路由事件 – 一个隧道和另一个冒泡。 隧道事件名称始终以“预览”开始并首先引发。 这让父母有机会在事件到达孩子之前看到事件。 紧接着是冒泡的对手。 在大多数情况下,你只会处理冒泡的。 预览通常会用于

  • 阻止事件( e.Handled = true
  • 导致父母提前做一些事情来正常的事件处理。

例如,如果UI Tree = Button包含Grid,则Canvas包含Ellipse
点击椭圆会导致(MouseDownButton被按下,点击被提高)。

 PreviewMouseDownButton PreviewMouseDownGrid PreviewMouseDownCanvas PreviewMouseDownEllipse MouseDownEllipse MouseDownCanvas MouseDownGrid 

我发现这个博客条目在描述不同之处时非常有用:

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

您有可视化树,当树中的元素发生事件时,首先预览事件将从根传播到元素(隧道):将在所有这些元素上引发PreviewKeyDown事件,然后将“正常”事件将从元素传播到根(冒泡)。

基本上,这是相同的事件,但发生在主要事件之前。 他们存在,所以你可以听到这些types的事件,而不会干扰控制的正常行为,当这些事件发生。

例如,当你点击或者input鼠标等时,button会执行某些操作。如果你自己处理这些事件,你必须确保你做的是相同的事情,否则你的button将不会相同。 预览事件可以在同一时间线上为您提供一个事件,而无需担心现有function的混乱。

这在处理自定义样式/触发器/控件模板时特别有用。 当你开始重写控制外观/行为。

因此,在您的控件中,在OnKeyDown事件中执行所需的主要工作,并将预览事件留给其他人使用,这就是我如何使用它们。

这种差异与路由事件有关,这就是WPF实现其事件处理策略的方式。 标准事件名称(即KeyDown等)意味着冒泡路由策略。 预览“(即PreviewKeyDown等)的前缀意味着隧道路由策略。 你可以在这里更详细地阅读这些策略。 基本上,当WPF中的一个事件被调用时,它首先从最上面的元素到可视化树中的元素传递到调用该事件的元素并最终返回。 在树下的路上,您将遇到PreviewKeyDown事件,并在返回时按顺序遇到KeyDown事件。