WPF 自定义路由事件

ops/2024/9/24 10:20:28/

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/ops/115235.html

相关文章

AOP实现自动化日志记录,并将日志记录到es中

在实际开发当中&#xff0c;日志记录是非常有必要的。将日志记录和业务逻辑解耦&#xff0c;可以引入日志框架&#xff08;如 SLF4J Logback&#xff09;并结合 AOP 实现自动化日志记录。 引入依赖 <dependency><groupId>org.slf4j</groupId><artifactI…

基于单片机与 PC 机通信的数据采集控制系统设计

摘 要 : 设计出基于单片机与 PC 机通信的数据采集控制系统方法 。 被控对象经传感器 、 电压变换电路 、 A/D 转换芯片与单片机相连, 可将现场参数信息传送至单片机 ; 单片机经继电器驱动控制被控对象运行 。 单片机与 PC 机经电平转换芯片相连, 实现远程通信功能 。…

(自用复习题)常微分方程01

题目来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 书中习题1.2 5.求下列两个微分方程的公共解 y ′ y 2 2 x − x 4 , y ′ 2 x x 2 x 4 − y − y 2 yy^22x-x^4,y2xx^2x^4-y-y^2 y′y22x−x4,y′2xx2x4−y−y2 两方程的公共解满足 y 2 2 x…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的应用来说&#xff0c;总需要用户点开应用体验较繁琐。针对此种场景&#xff0c;HarmonyOS提供了Form Kit&#xff08;卡片开发服…

MATLAB中的无线通信系统测试和验证方法有哪些

在MATLAB中&#xff0c;无线通信系统的测试和验证是一个全面的过程&#xff0c;它涉及到信号处理、调制与解调、信道建模、误码率分析以及无线通信标准的实现。以下是一些关键的测试和验证方法&#xff1a; 信道建模&#xff1a;为了模拟真实的通信环境&#xff0c;MATLAB提供了…

C++之STL—string容器

本质&#xff1a;类 class 封装了很多方法&#xff1a;查找find&#xff0c;拷贝copy&#xff0c;删除delete 替换replace&#xff0c;插入insert 构造函数 赋值操作 assign&#xff1a; 字符串拼接 &#xff0b; append&#xff1a; string查找和替换 没查找到&#xff0c;po…

CCRC-DSA数据安全评估师:数据安全架构是什么?

架构不仅是抽象的概念&#xff0c;更是项目规划、系统开发、产品部署和安全增强中必不可少的思维模式、沟通桥梁和共享语言。 简言之&#xff0c;它定义了系统中包含的元素及其相互关系&#xff0c;这些元素被称为组件或逻辑模块。 例如&#xff0c;“组件”指独立存在的基础…

MySQL record 07 part

索引 注意&#xff0c;是排序&#xff0c;有序就会加快查找的速度。 优势&#xff1a; 劣势 索引会单独占用存储空间索引虽然可以提高排序和查找的速度&#xff0c;但同时也会降低更新、删除、新增数据的速度&#xff0c;因为MySQL此时既要更改表&#xff0c;也要维护更改表后…