冒泡和隧道事件之间的区别

时间:2013-05-24 13:44:17

标签: wpf events event-handling

Bubbling Events和Tunneling事件之间的确切区别是什么? 我应该在哪里使用Bubbling Events以及我应该在哪里使用隧道事件? 在此先感谢!

2 个答案:

答案 0 :(得分:40)

  

WPF为我们提供了许多处理事件的不同机制 -   他们冒泡,隧道和直接。这些都被称为   路线活动。

     

直接活动

     

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

     

冒泡活动

     

现在我们都喜欢某种形式的气泡。冒泡发生了   当事件没有被元素处理时(例如一个textbox)和   事件“泡沫”向上持有它的UI容器。对于   例如,假设您有一个包含面板和内部的窗口   那个面板你有一个网格,在网格内你有一个文本框。如果   该事件不由文本框处理,然后移动,传递或   “气泡”直到网格级别(因为网格包含文本框),如果   它没有在那个级别处理,然后事件进一步上升   “树”(称为视觉树)到面板可能会或可能不会   被处理。此过程一直持续到处理或事件为止   “逃脱”最重要的元素。

     

冒泡事件的例子类似于   MouseButtonDown事件。或Keydown事件。

     

<强>隧道

     

隧道与Bubbling相反。所以不是一个事件   “向上”视觉树,事件沿着视觉树向下移动   被视为来源的元素。标准的WPF命名   隧道事件的定义是它们都以“预览”开头   例如previewdownkeypreviewmousebuttondown。您可以   抓住他们前往“目标”元素并处理它。一个   例如,你可能在网格中有一些控件   控制,由于某种原因你已经决定内部没有控制权   该网格将被允许字母“t”到达它。

Source以及作者的意见,我不支持也不同意。

And another StackOverflow question which is pretty much the same.

A nice demo project

And last but not least some explanation and another tutorial.

答案 1 :(得分:3)

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

两者之间的差异,正如命名约定所暗示的那样,隧道事件将从树中的最高节点(可能是Window)开始,然后下降到最低的子节点。一个冒泡的事件将从孩子开始,然后再次向上。

本指南应清楚说明: http://www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events