29

冒泡事件和隧道事件之间的确切区别是什么?

我应该在哪里使用冒泡事件以及应该在哪里使用隧道事件?

4

2 回答 2

61

WPF 为我们提供了许多不同的事件处理机制——它们是冒泡、隧道和直接的。这些都称为路由事件。

直接事件

您可能已经习惯了直接路由事件。这是项目本身处理发生的事件的地方。一个很好的例子是onClick在标准 WinForms 中处理鼠标按钮的 he -事件。这是在 GUI 项中引发事件并由所述 GUI 元素处理的地方。

冒泡事件

现在我们都喜欢某种形式的气泡。当事件没有被元素(比如 a textbox)处理并且事件“冒泡”到持有它的 UI 容器时,就会发生冒泡。例如,假设您有一个包含面板的窗口,在该面板内您有一个网格,在该网格内您有一个文本框。如果文本框未处理事件,则它会移动、传递或“冒泡”到网格级别(因为网格包含文本框),如果未在该级别处理,则事件会进一步冒泡“树”(称为可视化树)到可能会或可能不会被处理的面板。这个过程一直持续到它被处理或事件“逃脱”了最顶层的元素。

冒泡事件的示例类似于 MouseButtonDown事件。或者一个Keydown事件。

隧道

隧道与冒泡相反。因此,事件不是沿着可视树“向上”传播,而是沿着可视树向下传播到被认为是源的元素。隧道事件的标准 WPF 命名定义是它们都以“预览”开头,例如previewdownkeypreviewmousebuttondown. 您可以在它们到达“目标”元素的途中捕获它们并进行处理。例如,您可能在网格控件中有一些控件,并且由于某种原因,您决定不允许该网格中的任何控件让字母“t”到达它。

来源与作者的观点,我不支持也不同意。

还有另一个几乎相同的 StackOverflow 问题。

一个不错的演示项目

最后但并非最不重要的一些解释和另一个教程。

于 2013-05-24T13:48:10.047 回答
7

首先:WPF 中某些默认事件的命名约定是Preview<event>用于隧道和<event>冒泡。因此,例如对于 KeyDown,我们将分别拥有PreviewKeyDownKeyDown、隧道和冒泡。

正如命名约定所暗示的那样,两者之间的区别在于隧道事件将从树中的最高节点(可能是窗口)开始并向下到最低的子节点。冒泡事件将从孩子开始,然后再次向上。

本指南应该清楚地解释它:http: //www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events

于 2013-05-24T13:50:06.530 回答