您的位置:首页 > 健康 > 养生 > 青岛网上注册公司官网_阳泉网站建设哪家便宜_权重查询_seo教程seo优化

青岛网上注册公司官网_阳泉网站建设哪家便宜_权重查询_seo教程seo优化

2024/10/6 0:27:22 来源:https://blog.csdn.net/m0_51005282/article/details/142359667  浏览:    关键词:青岛网上注册公司官网_阳泉网站建设哪家便宜_权重查询_seo教程seo优化
青岛网上注册公司官网_阳泉网站建设哪家便宜_权重查询_seo教程seo优化

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com