WPF 自定义路由事件

devtools/2024/9/23 19:51:54/

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/devtools/116147.html

相关文章

Pandas_iloc_loc_哪个是inclusive哪个是exclusive

iloc 和 loc 包括不包括结尾写的那个行&#xff08;列&#xff09;&#xff1f; 不一样&#xff01; iloc[istart:iend] exclusive on iend 不包括结尾那行&#xff08;列&#xff09;&#xff01; loc[start:end] inclusive on end 包括结尾那行&#xff08;列&#xff09;&am…

Sentence Transformers 教程!

Sentence Transformers专注于句子和文本嵌入&#xff0c;支持超过100种语言。利用深度学习技术&#xff0c;特别是Transformer架构的优势&#xff0c;将文本转换为高维向量空间中的点&#xff0c;使得相似的文本在几何意义上更接近。 语义搜索&#xff1a;构建高效的语义搜索系…

计组(蒋)期末速成笔记1

蒋本珊计组期末不挂科复习笔记 第1章 概论 第2章 数据的机器层次表示 第3章 指令系统 第4章 数值的机器运算 第5章 存储系统和结构 第6章 中央处理器 第7章 总线 第1章 概论 蒋本珊计组期末不挂科复习笔记知道你快考试了&#xff0c;莫慌&#xff01; 第1章 概论1.1 冯诺依曼计…

CLion/Git版本控制

文章目录 文章介绍准备工具操作首次提交修改代码提交第二版 文章介绍 记录用clion和git做代码的版本控制 准备工具 CLion2024.2.0.1 git 操作 首次提交 该文件夹的打开方式选择clion 全部提交 成功提交后查看分支 修改代码提交第二版

技术速递|宣布 Azure Container Apps 上的 Java 体验正式推出

作者&#xff1a;Sean Li 排版&#xff1a;Alan Wang Azure Container Apps 是一个完全托管的、无服务器容器平台&#xff0c;使您能够构建、部署和运行容器化应用程序。使用 Azure Container Apps 您可以弹性扩缩容。您可以使用统一的网络设计弹性微服务&#xff0c;并利用启用…

python -- assert函数

一、assert函数 在 Python 中&#xff0c;assert 语句用于调试和测试代码。它用于检查某个条件是否为真。如果条件为假&#xff0c;assert 语句会抛出一个 AssertionError 异常&#xff0c;并可以选择性地附加一条错误消息。 assert 语句的基本语法是&#xff1a; assert co…

JDBC编程详细总结

一、JDBC编程 JDBC编程有标准步骤(八股文) 注册驱动 将sql语句的运行环境加载到JVM 连接数据库 获得执行SQL的对象 执行SQL语句,获得结果 关流 1、 注册驱动 Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动 Class.forName("com.mysql.cj.jdb…

无线安全(WiFi)

免责声明:本文仅做分享!!! 目录 WEP简介 WPA简介 安全类型 密钥交换 PMK PTK 4次握手 WPA攻击原理 网卡选购 攻击姿态 1-暴力破解 脚本工具 字典 2-Airgeddon 破解 3-KRACK漏洞 4-Rough AP 攻击 5-wifi钓鱼 6-wifite 其他 WEP简介 WEP是WiredEquivalentPri…