路由事件是一种具有更强传播能力的事件,可以双向传播。
路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件,当路由事件触发后,它可以向上或向下遍历,不需要任何定制的代码。
路由事件的三种方式
1、直接路由事件
与传统的.Net事件是非常类似的,都是用于一个元素,并且不能够传递给其他元素。
2、冒泡路由事件
是一种在元素树中向上传递的事件,事件首先由某个元素引发,然后向上传递给父元素处理事件,直到元素树的顶部。
我们可以用一个简单的程序测试一下冒泡路由事件的传播路径:
<Window x:Class="_08.Routing_event.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"
MouseUp="SomethingClicked">
<Grid MouseUp="SomethingClicked">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Label MouseUp="SomethingClicked" Margin="5" BorderThickness="2">
<StackPanel MouseUp="SomethingClicked">
<TextBox MouseUp="SomethingClicked" Margin="5">图像</TextBox>
<Image MouseUp="SomethingClicked" Source="E:/1 program/2Graduate Courses/lab/WPF/08.Routing event/Images/CUG.png" Stretch="None" Margin="5"></Image>
<TextBox MouseUp="SomethingClicked" Margin="5">图像</TextBox>
</StackPanel>
</Label>
<ListBox Margin="5" Name="ListMessages" Grid.Row="1"></ListBox>
<CheckBox Margin="5" Name="CheckHandle" Grid.Row="2">事件处理</CheckBox>
<Button Click="cmdClear_Click" Margin="5" Grid.Row="3" HorizontalAlignment="Right" >清除</Button>
</Grid>
</Window>
我们在Grid网格中分了4行,结构如下
- Grid
- Lable
- StackPanel
- TextBox
- Image
- TextBox
- StackPanel
- ListBox
- CheckBox
- Button
- Lable
我们在Gird、Lable、StackPanel、Image中分别设置了鼠标点击时的响应函数,因为点击鼠标左键是一个冒泡路由事件,我们在响应函数处理时可以输出当前处理元素的一些信息,这样我们就可以清楚地看到冒泡路由事件的处理顺序了
private void SomethingClicked(object sender, RoutedEventArgs e)
{
eventcount++;
string message = "#" + eventcount.ToString() + ":\r\n" +
"Sender:" + sender.ToString() + ":\r\n" +
"Source:" + e.Source + ":\r\n" +
"Original Source:" + e.OriginalSource;
ListMessages.Items.Add(message);
e.Handled = (bool)CheckHandle.IsChecked;
}
private void cmdClear_Click(object sender, RoutedEventArgs e)
{
eventcount = 0;
ListMessages.Items.Clear();
}
同样我们对按钮清除也设置一个响应函数,用来清除ListBox的信息。
我们点击Image图标,然后可以看输出结果:
3、隧道路由事件
是一种在元素树中向下传递的事件,与冒泡路由事件方向相反。
一般的,隧道路由事件有Preview前缀,比如PreviewKeyDown,和冒泡路由事件是成对定义出现的。
一般的,将隧道路由事件的Preview前缀去掉,即可变为一个冒泡路由事件。