WPF之路由事件的理解

时间:2024-11-01 11:06:14

博客园上讲解路由事件的文章很多,在此转其中之一供学习参考:

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)));
}
}
   <Style TargetType="{x:Type local:AA}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:AA}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Label Content="123" Background="{TemplateBinding Background}"></Label>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</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时背景就会由绿色变成红色。

这个很简单的代码,记录了冒泡事件的应用场景之一。