WPF隧道,实际使用?

时间:2011-07-08 09:25:25

标签: .net wpf tree tunneling

需要使用哪些实际场景隧道事件?

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

在练习中我为什么要举办活动?

隧道(和冒泡)是否也可以跨逻辑树或可视树或两者工作?

4 个答案:

答案 0 :(得分:8)

我发现隧道事件对于处理我自己没有创建的元素上的事件非常有用,因此没有简单的方法来添加事件处理程序。例如,ItemsControl基于模板生成UI元素,因此获取对这些元素的引用并不总是一个简单的过程。而不是为ItemsControl生成的每个项添加事件处理程序,而是可以在单个父元素上处理隧道事件。

路由事件traverse a 'hybrid' tree,它既不是可视树也不是逻辑树。这听起来有点疯狂,但它在过去从未引起过我的问题。

答案 1 :(得分:4)

在WPF中为所有OnPreview事件使用隧道事件。如果您希望实际的目标元素是接收事件的最后一个元素,那么隧道是有意义的。

如果您的列表框中包含一个包含文本框的项目。单击文本框将消耗单击,因此不选择列表框。如果您使用隧道或预览鼠标单击事件,则可以先选择,将其保留为未处理状态,然后将其移至文本框。另请注意,在WPF中,如果未处理预览事件,则每个事件将首先触发预览,然后触发气泡事件。

Msdn:

  

隧道:最初是事件处理程序   在元素树根被调用。   路由事件然后沿着路线行进   通过连续的子元素   沿着路线,朝向节点   作为路由事件的元素   来源(引发的元素   路由事件)。隧道路由事件   通常作为一部分使用或处理   合成控件,如   来自复合材料零件的事件可以   被故意压制或替换   通过特定的事件   完全控制。输入事件   WPF中提供的内容经常会实现   作为隧道/冒泡对。   隧道活动有时也是如此   被称为预览事件,因为   使用的命名约定   为了对。

AFAIK Visual树用于遍历,但由于MSDN已关闭,我找不到合适的源。

答案 2 :(得分:3)

这是MSDN的引用:

  

隧道:最初是事件处理程序   在元素树根被调用。   路由事件然后沿着路线行进   通过连续的子元素   沿着路线,朝向节点   作为路由事件的元素   来源(引发的元素   路由事件)。隧道路由事件   通常作为一部分使用或处理   合成控件,如   来自复合材料零件的事件可以   被故意压制或替换   通过特定的事件   完全控制。输入事件   WPF中提供的内容经常会实现   作为隧道/冒泡对。   隧道活动有时也是如此   被称为预览事件,因为   使用的命名约定   为了对。

隧道事件通常称为Preview - 事件。

enter image description here

您可能还想在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)

用户交互通常由事件对表示 - 一个预览交互(隧道)和一个响应它(冒泡)。首先进行隧道“预览”事件允许父控件拦截交互。

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