【问题标题】:Difference between Bubbling and Tunneling events冒泡事件和隧道事件之间的区别
【发布时间】:2013-05-20 03:24:32
【问题描述】:

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

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

【问题讨论】:

    标签: wpf events event-handling


    【解决方案1】:

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

    直接事件

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

    冒泡事件

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

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

    隧道

    隧道与冒泡相反。所以不是一个事件发生 “向上”视觉树,事件沿着视觉树向下传播 被认为是源的元素。标准的 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。顺便说一句,“一个不错的演示项目”的链接现在已经死了。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2011-06-11
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多