WPF隧道事件的实际应用?

6

什么实际场景需要使用事件隧道技术?

我知道一个模糊的答案是当我们想要处理跨越触发事件的视觉/逻辑时使用它。但那只是理论。

在实践中,为什么我应该使用事件隧道技术?

另外,事件隧道(和冒泡)是在逻辑树还是视觉树或两者之间起作用?

4个回答

8
我发现隧道事件在处理我没有创建的元素上非常有用,因此没有简单的方法来添加事件处理程序。例如,ItemsControl根据模板生成UI元素,因此获取对这些元素的引用并不总是一个简单的过程。您可以在单个父元素上处理隧道事件,而不是为ItemsControl生成的每个项添加事件处理程序。
路由事件遍历“混合”树,既不是可视树也不是逻辑树。这听起来有点疯狂,但在过去从未给我带来问题。

4
隧道事件在WPF中用于所有的OnPreview事件。如果你希望实际的目标元素是最后接收事件的元素,那么使用隧道事件是有意义的。
如果你有一个包含文本框的列表框项。点击文本框会消耗点击事件,因此不会选择列表框。如果你使用隧道或预览鼠标单击事件,你可以先选择它,然后让它未处理并传递到文本框。还要注意,在WPF中,如果预览事件未处理,则每个事件都会首先触发预览事件,然后再触发冒泡事件。
MSDN:
隧道:首先调用元素树根处的事件处理程序。然后,路由事件沿着路径穿过连续的子元素,向节点元素(引发路由事件的元素)传播。隧道路由事件通常作为控件合成的一部分使用或处理,以便可以有意地抑制或替换来自组合部件的事件,使其变为特定于完整控件的事件。在WPF中提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也被称为预览事件,因为这是用于这些事件对的命名约定。
据我所知,可视化树用于遍历,但由于MSDN已经关闭,我无法查找到适当的来源。

首先,事件通过一系列预览事件向下穿越控件层次结构。然后,它通过一系列最终的、可能被转换的事件向上冒泡回到控件层次结构中。为什么隧道事件会在冒泡事件之前发生呢? - Vikas Gupta

3
这是来自MSDN的引用:

隧道:首先,事件处理程序在元素树根处被调用。然后,路由事件沿着路径通过连续的子元素向节点元素传递(即引发路由事件的元素)。隧道路由事件通常用作控件合成的一部分进行处理,以便可以有意地抑制或替换来自组合部分的事件,而使用特定于完整控件的事件。WPF中提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也被称为预览事件,因为使用了一个命名约定来表示这些事件的对。

隧道事件通常被称为预览事件。
你可能还想阅读这篇MSDN文章:高级WPF:理解WPF中的路由事件和命令@Robert Havery 在SO上对类似问题写了一个很好的解释。

1

用户交互通常由一对事件表示 - 一个预览交互(隧道)和一个对其做出反应(冒泡)。将隧道“预览”事件放在前面允许父控件拦截交互。

例如,如果您要创建自己的按钮样式用户控件,则控件的一部分可能是图标。如果用户单击图标,则会拦截隧道单击预览事件,因为图标不需要知道它已被单击。然后,您可以引发冒泡事件,通知包含您的按钮的任何控件它已被单击。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接