WPF 自定义路由事件
如何:创建自定义路由事件
首先自定义事件支持事件路由,需要使用 RegisterRoutedEvent 方法注册 RoutedEvent
C#语法
public static RoutedEvent RegisterRoutedEvent( string name, RoutingStrategy routingStrategy, Type handlerType, Type ownerType )
参数
- name
- 类型:System.String 路由事件的名称。该名称在所有者类型中必须是唯一的,并且不能为 null 或空字符串。
- routingStrategy
- 类型:System.Windows.RoutingStrategy 作为枚举值的事件的路由策略。
- handlerType
- 类型:System.Type 事件处理程序的类型。该类型必须为委托类型,并且不能为 null。
- ownerType
- 类型:System.Type 路由事件的所有者类类型。该类型不能为 null。
下面我们通过示例展示自定义路由事件:
先看下xaml文件,我们可以看到button中并没有click事件
<Window x:Class="简单自定义路由事件.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"> <Grid> <Button Content="获取时间" Height="29" HorizontalAlignment="Left" Margin="192,170,0,0" Name="button1" VerticalAlignment="Top" Width="100" /> <TextBox Height="58" HorizontalAlignment="Left" Margin="89,80,0,0" Name="textBox1" VerticalAlignment="Top" Width="339" /> <Label Content="自定义路由事件演示" Height="38" HorizontalAlignment="Left" Margin="141,26,0,0" Name="label1" VerticalAlignment="Top" Width="208" FontSize="22" Background="BlanchedAlmond" /> </Grid> </Window>
后台代码简单展示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace 简单自定义路由事件 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.button1.AddHandler(Button.ClickEvent,//处理的事件 new RoutedEventHandler(RoutedEvent)); //事件委托 this.MEvent += new RoutedEventHandler(MainWindow_MEvent); } void MainWindow_MEvent(object sender, RoutedEventArgs e) { this.textBox1.Text = System.DateTime.Now.ToString(); } private static readonly RoutedEvent MyEvent = EventManager.RegisterRoutedEvent("Event",//路由事件的名称 RoutingStrategy.Direct,//事件的路由策略 typeof(RoutedEvent), //事件处理程序的类型。该类型必须为委托类型 typeof(RoutedEventArgs));//路由事件的所有者类类型 //事件访问器,进行事件提供添加和移除。 public event RoutedEventHandler MEvent { add { AddHandler(MyEvent, value); } remove { RemoveHandler(MyEvent, value); } } void RoutedEvent(object o, RoutedEventArgs e) { //关联路由事件 RoutedEventArgs args = new RoutedEventArgs(MyEvent); this.RaiseEvent(args); } } }
效果展示:
上面详细的说明建自定义路由事件的基本原理的原理,我们可以通过这样的方式来实现自己的路由事件,这样的代码移致性很高,我们可以需要的时候直接移植.