什么实际场景需要使用事件隧道技术?
我知道一个模糊的答案是当我们想要处理跨越触发事件的视觉/逻辑时使用它。但那只是理论。
在实践中,为什么我应该使用事件隧道技术?
另外,事件隧道(和冒泡)是在逻辑树还是视觉树或两者之间起作用?
ItemsControl
根据模板生成UI元素,因此获取对这些元素的引用并不总是一个简单的过程。您可以在单个父元素上处理隧道事件,而不是为ItemsControl
生成的每个项添加事件处理程序。隧道事件通常被称为隧道:首先,事件处理程序在元素树根处被调用。然后,路由事件沿着路径通过连续的子元素向节点元素传递(即引发路由事件的元素)。隧道路由事件通常用作控件合成的一部分进行处理,以便可以有意地抑制或替换来自组合部分的事件,而使用特定于完整控件的事件。WPF中提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也被称为预览事件,因为使用了一个命名约定来表示这些事件的对。
预览
事件。@Robert Havery
在SO上对类似问题写了一个很好的解释。
用户交互通常由一对事件表示 - 一个预览交互(隧道)和一个对其做出反应(冒泡)。将隧道“预览”事件放在前面允许父控件拦截交互。
例如,如果您要创建自己的按钮样式用户控件,则控件的一部分可能是图标。如果用户单击图标,则会拦截隧道单击预览事件,因为图标不需要知道它已被单击。然后,您可以引发冒泡事件,通知包含您的按钮的任何控件它已被单击。