WPF Demo511 控件共用事件
路由事件:
1.路由事件一般使用的三種策略如下所示:
A.Bubble(冒泡模式):事件從自己激發一直傳遞到根元素;
B.Direct(直接模式):只有事件源才有機會相應事件(和傳統事件一樣);
C.Tunnel(隧道模式):事件從根元素傳遞到自己。
一般情況,WPF提供的輸入事件都是以冒泡/隧道對實現的。隧道事件常常被稱為Preview事件。
2.路由事件的註冊方式
通過EventManager的RegisterRoutedEvent()函數向事件系統註冊路由事件;
public static RoutedEvent RegisterRoutedEvent(string name, RoutingStrategy routingStrategy,
Type handlerType, Type ownerType);
參數解釋:
第一個參數name表示事件在WPF事件系統中的名稱;
第二個參數routingStrategy則標明了路由事件的路由原則;
第三個參數handlerType用來標明事件處理函數的類型;
第四個參數ownerType則用來標明擁有該路由事件的類型。
例如:
Control類註冊MouseDoubleClick事件的代碼如下:
public static readonly RoutedEvent MouseDoubleClickEvent =
EventManager.RegisterRoutedEvent("MouseDoubleClick", RoutingStrategy.Direct,
typeof(MouseButtonEventHandler), typeof(Control));
EventManager類還提供了一個RegisterClassHandler()函數,以為特定路由事件註冊類處理程序。
該函數的原型如下:
public static void RegisterClassHandler(Type classType, RoutedEvent routedEvent,
Delegate handler, bool handledEventsToo);
第一個參數用來指定註冊類處理函數的類型;
第二個參數則用來指定類處理函數所需要偵聽的事件;
第三個參數則指明了類處理函數;
第四個參數設置為true則允許類處理函數能夠處理被標記為已處理的路由事件。
3.創建自定義路由事件的步驟:
(1)聲明並註冊路由事件;
(2)為路由事件添加CLR事件包裝;
(3)創建可以激發路由事件的方法。
<Window x:Class="WPFDemos.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Gridx:Name="GridRoot" > <Grid x:Name="gridA" Margin="10" Background="Blue"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10"> <Button x:Name="buttonLeft" Width="40" Height="100" Margin="30,135,357,76" Content="left"> <Button.RenderTransform> <!--旋轉度數--> <RotateTransform Angle="270"/> </Button.RenderTransform> </Button> <Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10"> <Button x:Name="buttonRight" HorizontalAlignment="Center" Content="right" Width="40" Height="100" Margin="138,105,325,106" > <Button.LayoutTransform > <RotateTransform Angle="90"/> </Button.LayoutTransform> </Button> <Button Content="test" Height="23" HorizontalAlignment="Left" Margin="80,217,0,0" Name="buttontest" VerticalAlignment="Top" Width="75" > <Button.RenderTransform> <!--旋轉度數--> <RotateTransform Angle="13"/> </Button.RenderTransform> </Button> </Canvas> </Canvas> </Grid> </Grid> </Window>
using System.Windows; using System.Windows.Controls; namespace WPFDemos { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //當同一個UI中存在多個相同控件的相同事件時可考慮使用,例如計算器中的Button事件 this.GridRoot.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.ButtonClicked)); } private void ButtonClicked(object sender,RoutedEventArgs e) { MessageBox.Show("Test==" +(e.OriginalSource as FrameworkElement).Name); } } }
WPF Demo511 控件共用事件