WPF之路由事件的理解

2019-12-01 来源: 七彩石头 发布在  https://www.cnblogs.com/qcst123/p/11967573.html

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

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时背景就会由绿色变成红色。

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

相关文章