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



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

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

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

<

直接事件/strong>

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

<

冒泡事件/strong>

现在我们都喜欢某种形式的气泡。会发生冒泡当元素(例如textbox)不处理事件时事件"冒泡"的方式向上的UI容器容纳它。为例如,假设您有一个包含面板和内部的窗口那个面板有一个网格,网格里面有一个文本框。如果事件不是由文本框处理的,然后它移动,传递或"冒泡"一直到网格级别(因为网格包含文本框),如果如果在该级别上没有处理,那么事件将进一步向上冒泡"树"(称为视觉树)到面板上,它可能在哪里,也可能不在哪里处理。这个过程一直持续到事件处理完毕"转义"最上面的元素。

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

隧道

隧道是鼓泡的对立面。所以不是一个事件在视觉树上,事件沿着视觉树向下传播被认为是源的元素。标准的WPF命名隧道事件的定义是它们都以"预览"开始。例如previewdownkeypreviewmousebuttondown。你可以在它们到达"目标"元素的路上抓住它们并处理它。一个例如,您可能在网格中有一些控件因为某种原因,你决定不再控制自己该网格将允许有字母"t"到达它。

我不支持也不同意作者的观点。

和另一个差不多的StackOverflow问题

一个很好的演示项目

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

首先:在WPF中,一些默认事件的命名约定是Preview<event>(隧道)和<event>(冒泡)。例如,对于KeyDown,我们将有PreviewKeyDownKeyDown,分别隧道和冒泡。

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

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

最新更新