• WPF之路由事件的理解


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

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

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

  • 相关阅读:
    SQL的运算符优先级
    oracle截取某一个字符之前或之后的值;substr();instr()
    转载-如何成为OpenStack工程师
    入门书籍推荐
    docker学习谈
    mysql学习之旅-主从复制
    LInux断电后无法进入系统报错unexpected inconsistency run fsck manully
    mysqlbinlog读取二进制日志文件时,报错 (转)
    MySQL的binlog详解(转)
    mysql学习之旅-运维手册
  • 原文地址:https://www.cnblogs.com/qcst123/p/11967573.html
Copyright © 2020-2023  润新知