2009-09-22 71 views
62

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

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

回答

105

从编程WPF克里斯 - 塞尔斯和伊恩·格里菲斯

在直接的事件外, WPF定义 对大多数路由事件 - 一个隧道和其他 冒泡。隧道事件名称 总是以“预览”开头,并且首先会提出 。这让父母在 到达孩子之前有机会看到事件。其次是 冒泡的对手。在大多数 的情况下,你将只处理冒泡之一 。预览会 通常用来

  • 块的事件(e.Handled = true
  • 引起家长做一些提前到正常的事件处理。

例如,如果UI树=按钮包含网格包含画布包含椭圆
点击椭圆会导致(MouseDownButton被巴顿吃掉,然后点击改为引发。)

PreviewMouseDownButton 
PreviewMouseDownGrid 
PreviewMouseDownCanvas 
PreviewMouseDownEllipse 
MouseDownEllipse 
MouseDownCanvas 
MouseDownGrid 
+0

谢谢,我一直在MSDN找遍,但没有找到它,我读到每个人都在谈论冒泡和隧道,但是这个文本在任何地方都失踪了。 – 2009-09-22 14:27:24

3

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

例如,按钮做的事情时,你如果你处理这些自己,你必须确保你做同样的事情,否则你的按钮将不会采取同样的事件点击或的MouseEnter等。预览事件可以在同一时间线上为您提供一个事件,而不必担心会混淆现有的功能。

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

所以在你的控制,做你想做的主要工作在onKeyDown事件,离开他人使用预览事件,是我与他们合作。

3

这个区别与路由事件有关,这是WPF实现其事件处理策略的方式。标准事件名称(即KeyDown等)意味着冒泡路由策略。以“预览”(即PreviewKeyDown等)作为前缀的那些意味着隧道路由策略。您可以更详细地阅读这些策略here。基本上,当WPF中的事件被调用时,它首先从视觉树中最顶端的元素到调用该事件的元素,最后返回向上。在沿着树的路上,您将遇到PreviewKeyDown事件,并且在回程中您将按照该顺序遇到KeyDown事件。