博客園上講解路由事件的文章不少,在此轉其中之一供學習參考: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時背景就會由綠色變成紅色。
這個很簡單的代碼,記錄了冒泡事件的應用場景之一。