Bubbling Events和Tunneling事件之间的确切区别是什么? 我应该在哪里使用Bubbling Events以及我应该在哪里使用隧道事件? 在此先感谢!
答案 0 :(得分:40)
WPF为我们提供了许多处理事件的不同机制 - 他们冒泡,隧道和直接。这些都被称为 路线活动。
直接活动
您可能已经习惯了直接路由事件。这是 项目本身处理发生的事件的位置。一个很好的例子 将处理他
onClick
- 标准的鼠标按钮事件 的WinForms。这是在GUI项中引发事件并获取的地方 由所述GUI元素处理。冒泡活动
现在我们都喜欢某种形式的气泡。冒泡发生了 当事件没有被元素处理时(例如一个
textbox
)和 事件“泡沫”向上持有它的UI容器。对于 例如,假设您有一个包含面板和内部的窗口 那个面板你有一个网格,在网格内你有一个文本框。如果 该事件不由文本框处理,然后移动,传递或 “气泡”直到网格级别(因为网格包含文本框),如果 它没有在那个级别处理,然后事件进一步上升 “树”(称为视觉树)到面板可能会或可能不会 被处理。此过程一直持续到处理或事件为止 “逃脱”最重要的元素。冒泡事件的例子类似于
MouseButtonDown
事件。或Keydown
事件。<强>隧道强>
隧道与Bubbling相反。所以不是一个事件 “向上”视觉树,事件沿着视觉树向下移动 被视为来源的元素。标准的WPF命名 隧道事件的定义是它们都以“预览”开头 例如
previewdownkey
和previewmousebuttondown
。您可以 抓住他们前往“目标”元素并处理它。一个 例如,你可能在网格中有一些控件 控制,由于某种原因你已经决定内部没有控制权 该网格将被允许字母“t”到达它。
Source以及作者的意见,我不支持也不同意。
And another StackOverflow question which is pretty much the same.
And last but not least some explanation and another tutorial.
答案 1 :(得分:3)
首先:WPF中某些默认事件的命名约定是Preview<event>
用于隧道,<event>
用于冒泡。因此,例如对于KeyDown,我们将分别使用PreviewKeyDown
和KeyDown
,隧道和冒泡。
两者之间的差异,正如命名约定所暗示的那样,隧道事件将从树中的最高节点(可能是Window)开始,然后下降到最低的子节点。一个冒泡的事件将从孩子开始,然后再次向上。
本指南应清楚说明: http://www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events