需要使用哪些实际场景隧道事件?
我知道一个模糊的答案可能是当我们想要处理引发事件的视觉/逻辑事件时使用它。但那只是理论。
在练习中我为什么要举办活动?
隧道(和冒泡)是否也可以跨逻辑树或可视树或两者工作?
答案 0 :(得分:8)
我发现隧道事件对于处理我自己没有创建的元素上的事件非常有用,因此没有简单的方法来添加事件处理程序。例如,ItemsControl
基于模板生成UI元素,因此获取对这些元素的引用并不总是一个简单的过程。而不是为ItemsControl
生成的每个项添加事件处理程序,而是可以在单个父元素上处理隧道事件。
路由事件traverse a 'hybrid' tree,它既不是可视树也不是逻辑树。这听起来有点疯狂,但它在过去从未引起过我的问题。
答案 1 :(得分:4)
在WPF中为所有OnPreview事件使用隧道事件。如果您希望实际的目标元素是接收事件的最后一个元素,那么隧道是有意义的。
如果您的列表框中包含一个包含文本框的项目。单击文本框将消耗单击,因此不选择列表框。如果您使用隧道或预览鼠标单击事件,则可以先选择,将其保留为未处理状态,然后将其移至文本框。另请注意,在WPF中,如果未处理预览事件,则每个事件将首先触发预览,然后触发气泡事件。
Msdn:
隧道:最初是事件处理程序 在元素树根被调用。 路由事件然后沿着路线行进 通过连续的子元素 沿着路线,朝向节点 作为路由事件的元素 来源(引发的元素 路由事件)。隧道路由事件 通常作为一部分使用或处理 合成控件,如 来自复合材料零件的事件可以 被故意压制或替换 通过特定的事件 完全控制。输入事件 WPF中提供的内容经常会实现 作为隧道/冒泡对。 隧道活动有时也是如此 被称为预览事件,因为 使用的命名约定 为了对。
AFAIK Visual树用于遍历,但由于MSDN已关闭,我找不到合适的源。
答案 2 :(得分:3)
这是MSDN的引用:
隧道:最初是事件处理程序 在元素树根被调用。 路由事件然后沿着路线行进 通过连续的子元素 沿着路线,朝向节点 作为路由事件的元素 来源(引发的元素 路由事件)。隧道路由事件 通常作为一部分使用或处理 合成控件,如 来自复合材料零件的事件可以 被故意压制或替换 通过特定的事件 完全控制。输入事件 WPF中提供的内容经常会实现 作为隧道/冒泡对。 隧道活动有时也是如此 被称为预览事件,因为 使用的命名约定 为了对。
隧道事件通常称为Preview
- 事件。
您可能还想在Advanced WPF: Understand Routed Events and Commands in WPF上阅读此MSDN文章。 @Robert Havery
wrote a good explenation to a similar question here on SO.
答案 3 :(得分:1)
用户交互通常由事件对表示 - 一个预览交互(隧道)和一个响应它(冒泡)。首先进行隧道“预览”事件允许父控件拦截交互。
例如,如果您要创建自己的按钮样式用户控件,则控件的一部分可能是一个图标。如果用户要单击该图标,您将拦截隧道点击预览事件,因为图标不需要知道它被单击。然后,您可以发出冒泡事件,通知任何包含按钮的控件已被单击。