博客园上讲解路由事件的文章很多,在此转其中之一供学习参考:
https://www.cnblogs.com/zhili/p/WPFRouteEvent.html
网上流传的文章中都对冒泡进行了说明,但都是千遍一律,那在实际使用中如何才能使用一冒泡的路由事件呢?
<Grid x:Name="GridRoot" Background="Lime" Button.Click="Button_Click"> <Grid x:Name="GridA" Margin="10" Background="Blue" Button.Click="Button_Click"> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <Canvas x:Name="CanvasLeft" Grid.Column="0" Background="Red" Margin="10" > <Button x:Name="ButtonLeft" Width="65" Height="100" Margin="10" Content="Left" Button.Click="Button_Click"></Button> </Canvas> <Canvas x:Name="CanvasRight" Grid.Column="1" Background="Yellow" Margin="10" Button.Click="Button_Click"> <Button x:Name="ButtonRight" Width="65" Height="100" Margin="10" Content="Right" Button.Click="Button_Click"></Button> </Canvas> </Grid>
如上代码所示:
1.冒泡事件是从”内往外“传递,但并不是每个节点都必需要有该事件。如上Canvas 节点并没有Button.Click="Button_Click";
2.每一节点并不是必须都是同一事件,例如将Grid 节点的Button.Click="Button_Click"可改为Button.Click="Button_Click0000",而Button_Click0000事件处理程序可以是不同于Button_Click的处理逻辑;
3.冒泡的路由事件应用场景之一:假如需要自己定义一个新的控件类型AA,AA的模板中包含一个lable的控件,此时AA并不能”触发“点击事件,但lable有点击事件,这时就可以把lable的点击事件作为附加事件给AA,当点击AA控件时,这时就能”触发“事件了。(路由事件实际是由控件节点进行”监听“,”监听“到事件到了就会执行事件处理程序,并不是”触电发“,这里说的触发只是一个便于理解的表象)
请看以下代码:
利用VS自定义一个AA的控件,以下是默认产生的代码:
public class AA : Control { static AA() { DefaultStyleKeyProperty.OverrideMetadata(typeof(AA), new FrameworkPropertyMetadata(typeof(AA))); } }
1 <Style TargetType="{x:Type local:AA}"> 2 <Setter Property="Template"> 3 <Setter.Value> 4 <ControlTemplate TargetType="{x:Type local:AA}"> 5 <Border Background="{TemplateBinding Background}" 6 BorderBrush="{TemplateBinding BorderBrush}" 7 BorderThickness="{TemplateBinding BorderThickness}"> 8 <Label Content="123" Background="{TemplateBinding Background}"></Label> 9 </Border> 10 </ControlTemplate> 11 </Setter.Value> 12 </Setter> 13 </Style>
除了第8行代码是自己加的,其它代码都是自动产生的。可自定义的控件AA里面什么都没有,在此我放了一个lable在里面。下面是将lable的mouseDown事件附加到AA上去,使在点击AA时,AA的背景色改变。
<Grid x:Name="GridRoot" Background="Lime" Button.Click="Button_Click1"> <local:AA x:Name="aa" Label.MouseDown="Button_Click" Background="Green"> </local:AA> </Grid>
private void Button_Click(object sender, RoutedEventArgs e) { this.aa.Background = Brushes.Red; }
当点击AA时背景就会由绿色变成红色。
这个很简单的代码,记录了冒泡事件的应用场景之一。