理解路由事件
路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件,也就是说,触发事件源的父级或子级如果都有对该事件的监听,则都能触发事件
路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件,当路由事件触发后,它可以向上或向下遍历可视树和逻辑树,他用一种简单而持久的方式在每个元素上触发,而不需要任何定制的代码(如果用传统的方式实现一个操作,执行整个事件的调用则需要执行代码将事件串联起来)
路由事件的路由策略
所谓的路由策略就是指:路由事件实现遍历元素的方式
路由事件一般使用以下三种路由策略:
- 冒泡:由事件源向上传递一直到根元素
- 直接:只有事件源才有机会响应事件
- 隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源
一般情况下,WPF提供的输入事件都是以隧道/冒泡对实现的。隧道事件常常被称为Preview事件
冒泡
程序设计思路是,将多个Grid嵌套起来,构成父子结构,在最底层支Grid上定义一个按钮,绑定一个单击事件,并且按钮的所有低级元素都绑定该事件,它们使用同一个事件处理程序;再定义一个ListBox,当事件处理程序执行的时候,打印出事件激发者的名字,这样便能看到事件执行的顺序
下图是界面设计:
下面是XMAL代码,按钮和每一个Grid都绑定了Button.Click="Btn_Click"
<Window x:Class="WPF_CODE.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<!--最外层的Grid-->
<Grid Button.Click="Btn_Click" Name="Grid_1" Background="#FF43AEAE">
<!--定义两行-->
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--第二层Grid-->
<Grid Button.Click="Btn_Click" Name="Grid_2" Margin="10" Background="#FF8D888D" Grid.Row=