WPF路由事件、隧道和冒泡

WPF路由事件、隧道和冒泡,wpf,xaml,Wpf,Xaml,在冒泡之前进行隧道挖掘而不是反之亦然,其背后的思想/哲学是什么?例如,这赋予容器在其子容器之前看到事件的能力。这在许多情况下都很有用,例如禁用子部件、悬停动画、拖放、在继续检查/单击子部件之前选择父容器等 换句话说,与创建自定义小部件和使用库存容器(冒泡)相比,为自定义UI行为创建新容器并预览进入库存小部件的事件(隧道)更容易。隧道在冒泡之前,因为事件处理程序位于元素树根中 这在“路由策略”中得到了很好的解释。不要100%地使用容器示例,举一个我理解的示例:),如果我在按钮上有一个图像,我不希望

在冒泡之前进行隧道挖掘而不是反之亦然,其背后的思想/哲学是什么?例如,这赋予容器在其子容器之前看到事件的能力。这在许多情况下都很有用,例如禁用子部件、悬停动画、拖放、在继续检查/单击子部件之前选择父容器等


换句话说,与创建自定义小部件和使用库存容器(冒泡)相比,为自定义UI行为创建新容器并预览进入库存小部件的事件(隧道)更容易。

隧道在冒泡之前,因为事件处理程序位于元素树根中


这在“路由策略”中得到了很好的解释。

不要100%地使用容器示例,举一个我理解的示例:),如果我在按钮上有一个图像,我不希望按钮获得鼠标所有者事件以进行单击处理,而不是以其他方式?因此,由图像组成的按钮冒泡应该是第一个,而不是在类似的线路上进行隧道挖掘。当隧道挖掘在冒泡之前有意义时,如果按钮中有图像,并且您在图像区域中单击,则按钮将首先接收隧道事件(“PreviewMouseDown”),而图像将首先接收冒泡事件。因为隧道发生在冒泡之前,所以您只需要在按钮上实现处理程序,而不管其内容如何。