当前位置: 首页 > news >正文

WPF 自定义路由事件

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++从入门到起飞之——多态 全方位剖析!
  • 普通程序员如何快速入门AIGC
  • C/C++内存管理 ——
  • 【WPF】桌面程序开发之窗口的用户控件详解
  • 医院信息化运维监控:确保医疗系统的稳定与安全
  • 运行WPS报错
  • 14年数据结构
  • Spring IoC DI
  • [图解]静态关系和动态关系
  • qt-C++笔记之作用等同的宏和关键字
  • 006——队列
  • Maven国内镜像(四种)
  • 产品经理面试整理-了解公司和产品
  • git-repo系列教程(6) 在自己服务器上搭建git-repo仓库
  • 数据结构(7.3_4)——红黑树的定义和性质
  • [PHP内核探索]PHP中的哈希表
  • (三)从jvm层面了解线程的启动和停止
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • canvas绘制圆角头像
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Iterator 和 for...of 循环
  • Java教程_软件开发基础
  • js中的正则表达式入门
  • k8s如何管理Pod
  • laravel with 查询列表限制条数
  • Next.js之基础概念(二)
  • node入门
  • PV统计优化设计
  • Python打包系统简单入门
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spark学习笔记之相关记录
  • spring-boot List转Page
  • Theano - 导数
  • Vue.js源码(2):初探List Rendering
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • zookeeper系列(七)实战分布式命名服务
  • 阿里云应用高可用服务公测发布
  • 百度小程序遇到的问题
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 网页视频流m3u8/ts视频下载
  • 一个项目push到多个远程Git仓库
  • 智能合约Solidity教程-事件和日志(一)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 阿里云API、SDK和CLI应用实践方案
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 选择阿里云数据库HBase版十大理由
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (7)摄像机和云台
  • (C++17) optional的使用
  • (Forward) Music Player: From UI Proposal to Code
  • (html转换)StringEscapeUtils类的转义与反转义方法