WPF之路由事件的理解

博客園上講解路由事件的文章不少,在此轉其中之一供學習參考:html

 https://www.cnblogs.com/zhili/p/WPFRouteEvent.htmlide

網上流傳的文章中都對冒泡進行了說明,但都是千遍一概,那在實際使用中如何才能使用一冒泡的路由事件呢?學習

 <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>

如上代碼所示:this

1.冒泡事件是從」內往外「傳遞,但並非每一個節點都必須要有該事件。如上Canvas 節點並無Button.Click="Button_Click";spa

2.每一節點並非必須都是同一事件,例如將Grid 節點的Button.Click="Button_Click"可改成Button.Click="Button_Click0000",而Button_Click0000事件處理程序能夠是不一樣於Button_Click的處理邏輯;code

3.冒泡的路由事件應用場景之一:假如須要本身定義一個新的控件類型AA,AA的模板中包含一個lable的控件,此時AA並不能」觸發「點擊事件,但lable有點擊事件,這時就能夠把lable的點擊事件做爲附加事件給AA,當點擊AA控件時,這時就能」觸發「事件了。(路由事件實際是由控件節點進行」監聽「,」監聽「到事件到了就會執行事件處理程序,並非」觸電發「,這裏說的觸發只是一個便於理解的表象)htm

請看如下代碼:blog

利用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時背景就會由綠色變成紅色。

這個很簡單的代碼,記錄了冒泡事件的應用場景之一。

相關文章
相關標籤/搜索