WPF 自定义路由事件

WPF 自定义路由事件

一、自定义路由事件步骤

**   ① 注册路由事件
   ② 为路由事件添加 CLR 事件包装器
   ③ 创建可激发路由事件的方法**

二、注册路由事件

EventManager.RegisterRoutedEvent(String, RoutingStrategy, Type, Type)

作用:将新的路由事件注册到 WPF 事件系统中。

参数:

String name

路由事件的名称,该名称必须唯一,且不能为 null 或空。

RoutingStrategy routingStrategy

路由策略。

Type handlerType

事件处理程序的类型。 必须为委托类型,不能为 null。

Type ownerType

路由事件的所有者类类型。 不能为 null(比如你声明一个控件,你对这个控件定义一个路由,所有者就是这个控件)

如果不需要传递参数,参数三可以使用原生的 RoutedEventHandler

csharp 复制代码
public partial class TestControl : UserControl
{
    //①声明和注册路由事件
    public static readonly RoutedEvent ClickRountEvent = EventManager.RegisterRoutedEvent("ClickRount", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TestControl ));
}

如果 RoutedEventHandler 的参数跟我们自定义的事件参数不一致,就可以使用 EventHandler 的泛型版指定我的事件参数类型固定格式如下:

csharp 复制代码
public class RoutedDelegate : RoutedEventArgs
{
    public RoutedDelegate(RoutedEvent routedEvent, object source) : base(routedEvent, source)
    {
    }
    //添加自定义参数
    public string UriMessage { get; set; }
}

然后将参数三换成 EventHandler <定义的类> 即可

csharp 复制代码
public static readonly RoutedEvent ClickRountEvent = EventManager.RegisterRoutedEvent("ClickRount", RoutingStrategy.Bubble, typeof(EventHandler<RoutedDelegate>), typeof(TestControl ));

二、为路由事件添加 CLR 事件包装器

csharp 复制代码
//为路由事件添加 CLR 事件包装器
public event RoutedEventHandler ClickRount
{
    add { AddHandler(ClickRountEvent, value); }
    remove { RemoveHandler(ClickRountEvent, value); }
}

三、创建可激发路由事件的方法

我这里使用控件触发鼠标左键按下事件来触发

csharp 复制代码
//xaml
<vlc:VlcControl x:Name="vlcPlayer" MouseLeftButtonDown="vlcPlayer_MouseLeftButtonDown"/>
csharp 复制代码
//cs
private void vlcPlayer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     //将需要发送的信息与路由事件关联
     RoutedDelegate routedDelegate = new RoutedDelegate(ClickRountEvent, this);
     routedDelegate.UriMessage = VideoPath;
     //调用 RaiseEvent 方法发送该事件
     RaiseEvent(routedDelegate);
 }

三、调用

当我需要调用的时候,只需要再调用的地方为该路由指定一个方法,然后满足触发该路由条件时,就会触发该方法。

csharp 复制代码
//xaml
vlcPlay:TestControl ClickRount="TestControl_ClickRount" ></vlcPlay:TestControl >
csharp 复制代码
private void TestControl_ClickRount(object sender, RoutedEventArgs e)
{
    RoutedDelegate msg = e as RoutedDelegate;
}

---自定义路由完整代码:

csharp 复制代码
public partial class TestControl : UserControl
{
   #region 声明路由
   //声明和注册路由事件
   public static readonly RoutedEvent ClickRountEvent = EventManager.RegisterRoutedEvent("ClickRount", RoutingStrategy.Bubble, typeof(EventHandler<RoutedDelegate>), typeof(TestControl ));

   //为路由事件添加 CLR 事件包装器
   public event RoutedEventHandler ClickRount
   {
       add { AddHandler(ClickRountEvent, value); }
       remove { RemoveHandler(ClickRountEvent, value); }
   }

   private void vlcPlayer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
   {
       //将需要发送的信息与路由事件关联
       RoutedDelegate routedDelegate = new RoutedDelegate(ClickRountEvent, this);
       routedDelegate.UriMessage = VideoPath;
       //调用 RaiseEvent 方法发送该事件
       RaiseEvent(routedDelegate);
   }
   #endregion
}

public class RoutedDelegate : RoutedEventArgs
{
    public RoutedDelegate(RoutedEvent routedEvent, object source) : base(routedEvent, source)
    {
    }
    //添加自定义参数
    public string UriMessage { get; set; }
}
相关推荐
KmSH8umpK1 天前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第三篇
redis·分布式·wpf
KmSH8umpK1 天前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案
redis·分布式·wpf
武藤一雄1 天前
WPF:MessageBox系统消息框
前端·microsoft·c#·.net·wpf
武藤一雄1 天前
WPF进阶:万字详解WPF如何性能优化
windows·性能优化·c#·.net·wpf·.netcore·鲁棒性
wangnaisheng1 天前
【WPF】路由事件详细使用
wpf
雨浓YN2 天前
GKMLT通讯工具箱(WPF MVVM) - 07-倍福ADS通讯
网络·wpf
雨浓YN2 天前
GKMLT通讯工具箱(WPF MVVM) - 04-三菱MC通讯
wpf
不会编程的懒洋洋2 天前
WPF XAML+布局+控件
xml·开发语言·c#·视觉检测·wpf·机器视觉·视图
雨浓YN2 天前
GKMLT通讯工具箱(WPF MVVM) - 06-OPCUA通讯
wpf
雨浓YN2 天前
GKMLT通讯工具箱(WPF MVVM) - 03-西门子S7通讯
wpf