WPF高级教程(七)路由事件

本文深入探讨WPF的路由事件,包括定义、注册、共享、使用及分类。介绍了冒泡路由事件和隧道路由事件的传播机制,提供示例代码展示事件的触发和处理,强调了路由事件在元素树中的传播路径和处理策略。
摘要由CSDN通过智能技术生成

介绍

与依赖项属性一样,路由事件是WPF对于传统.NET事件的升级,使得事件拥有更强的传播能力。

定义,注册和包装

// 我们来看一个Click事件定义的例子
public abstract class ButtonBase : ContentControl
{
    // 定义路由事件
    public static readonly RoutedEvent ClickEvent;
    
    // 注册路由事件
    static ButtonBase()
    {
        ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
    }
    
    // 普通事件包装路由事件
    public event RoutedEventHandler Click
    {
        add
        {
            // AddHandler 和 RemoveHandler都是再FrameworkElement中定义的
            base.AddHandler(ButtonBase.ClickEvent, value);
        }
        remove
        {
            base.RemoveHandler(ButtonBase.ClickEvent, value);
        }
    }
}

共享

通过上面的定义我们可以看到,与依赖项属性一样,路由事件也是静态定义,包装为普通事件使用,那么我们自然就可以推测我们可以像依赖项属性一样,将别的类的路由事件作为己用,这里我们需要使用 RoutedEvent.AddOwner()方法。

// UIElement类添加Mouse类的MouseUp事件
UIElement.MouseUpEvent = Mouse.MouseUpEvent.AddOwner(typeof(UIElement));

使用

路由事件的引发

使用RaiseEvent方法引发路由事件

RoutedEventArgs e = new RoutedEventArgs(ButtonBase.ClickEvent, this);
base.RaiseEvent(e);
路由事件的处理

监听事件

// 在xaml中直接处理
<button Click="cmdOK_Click">OK</Button>
// 后台代码连接事件
img.MouseUp += new MouseButtonEventHandler(img_MouseUp);
// 甚至可以简化代码
img.MouseUp += img_MouseUp;
// 直接调用AddHandler方法,不通过事件包装器绑定
img.AddHandler(Image.MouseUpEvent, new MouseButtonEventHandler(image_MouseUp));
// 由于我们之前讲过的,这是一个共享事件&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值