WPF 自定义路由事件

news/2024/9/29 1:19:45/

WPF 自定义路由事件

一、自定义路由事件步骤

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

二、注册路由事件

  EventManager.RegisterRoutedEvent(String, RoutingStrategy, Type, Type)
    作用:将新的路由事件注册到 WPF 事件系统中。
    参数:
      String name
        路由事件的名称,该名称必须唯一,且不能为 null 或空。
      RoutingStrategy routingStrategy
        路由策略。
      Type handlerType
        事件处理程序的类型。 必须为委托类型,不能为 null。
      Type ownerType
        路由事件的所有者类类型。 不能为 null(比如你声明一个控件,你对这个控件定义一个路由,所有者就是这个控件)

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

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

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

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

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

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

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

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

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

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

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

三、调用

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

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

—自定义路由完整代码:

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

http://www.ppmy.cn/news/1530656.html

相关文章

zabbix基本概念与组件

文章目录 一、zabbix简介二、​​​​​​​zabbix构成三、​​​​​​​zabbix监控对象四、​​​​​​​zabbix常用术语五、 Zabbix 6.0 新特性1.Zabbix server高可用防止硬件故障或计划维护期的停机2.Kubernetes系统从多个维度采集指标 六、zabbix 工作原理1、主动模式2、…

C# 面对对象基础 枚举,Enum.TryParse的使用

代码&#xff1a; using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace Student_c_ {enum Week : int{Mon,Tus,Wed,Thu,Fri,Sat,Sun,}public cla…

深入理解及如何使用main函数参数

目录 前言&#xff1a;一、main函数参数二、main函数参数的意义及如何使用三、从操作系统层面&#xff08;指令&#xff09;理解main函数参数 前言&#xff1a; 在平时编写代码的过程中&#xff0c;我们会经常写main函数&#xff0c;这是一个程序必不可少的&#xff0c;main 函…

【WPF】多屏幕展示

使用环境为.Net Framework&#xff0c;如果有.Net 6的解决方案&#xff0c;欢迎交流。 话不多说&#xff0c;先上代码&#xff01; /// <summary>/// Window窗口展示设置/// </summary>/// <param name"monitor"></param>/// <param nam…

每天学习一个技术栈 ——【Celery】篇(2)

前篇&#xff1a;每天学习一个技术栈 ——【Celery】篇&#xff08;1&#xff09;-CSDN博客 四、常见场景 Celery的灵活性和强大功能使其在各种应用场景中得到广泛应用。以下是一些常见的使用场景&#xff0c;帮助你理解如何在实际项目中利用Celery。 1. 背景任务处理 在Web应…

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…

【C++】继承(下)

个人主页~ 继承&#xff08;上&#xff09;~ 继承 四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承以及菱形虚拟继承1、菱形继承2、菱形虚拟继承 八、继承的总结与反思继承和组合 四、派生类的默认成员函数 派生类的构造函数必须调用基类的构造…

SpringBoot开发——整合P6Spy详细记录SQL执行耗时情况

文章目录 1、p6spy是什么2、SpringBoot整合P6Spy2.1 引入依赖2.2 数据库操作2.3 测试代码2.4 p6spy配置2.5 其它自定义监控并优化数据库操作的性能至关重要。为了提升应用性能和数据库效率,很多项目会实现一个功能来打印SQL执行耗时。这一功能通过在SQL查询执行前后记录时间戳…