WPF中路由事件的应用
1.首先,查下MSDN里面的定义:
功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
然后,路由事件里面使用以下三个路由策略:冒泡、隧道、直接。简单的说就是冒泡事件是从事件源到根元素一次被引发,而隧道则相反。直接则是只有源元素本身调用以及相应。如果比较形象一点的话可以看一下这个http://www.cnblogs.com/WilliamJiang/archive/2012/02/09/2344697.html。
<StackPanel Name="stackPanel" Width="200" Height="100" Background="LightGray" Orientation="Horizontal" PreviewMouseUp="StackPanel_MouseUp"> <Label Name="label" Width="50" Content="Label" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewMouseUp="Label_MouseUp" Background="YellowGreen"/> </StackPanel>
private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e) { MessageBox.Show("Panel"); } private void Label_MouseUp(object sender, MouseButtonEventArgs e) { MessageBox.Show("Label"); }
以例子来说,如果这是一个panel,在panel里面有一个label,在panel和label上都触发mouseup(冒泡),则点击label时,会先触发label里面的事件(Show一个Label),再触发panel里面的事件(Show一个Panel)。隧道则相反。
如果希望不引发事件到根元素或者事件源,只需要在对应的事件中加入e.Handled = true;(冒泡是在Label中加入,则隧道是在Panel中加入),这样的话就可以不互相干扰的触发想要触发的元素。