【wpf】自定义事件总结(Action, EventHandler)

Action和EventHandle

Action和EventHandler都是.net帮我定义好的委托,我们可以直接使用,方便的定义事件。

利用Action定义事件

//无参事件
event Action Event1;
//有参事件
event Action<int, int, string> Event2;

事件订阅和事件处理

public 事件测试()
{
    InitializeComponent();
    // 事件的订阅
    Event1 += 事件测试_Event1;
    Event2 += 事件测试_Event2;

}



private void 事件测试_Event1()
{
    MessageBox.Show("事件测试_Event1");
}

private void 事件测试_Event2(int arg1, int arg2, string arg3)
{
    MessageBox.Show($"{arg1 + arg2} {arg3}");
}

事件的触发

private void btn1_Click(object sender, RoutedEventArgs e)
{
    //事件的触发
    Event1?.Invoke();
}

private void btn2_Click(object sender, RoutedEventArgs e)
{
    //事件的触发
    Event2?.Invoke(1, 2, "test");
}

这里通过Invoke调用和直接调用,效果和效率都是一样的,这样写凸显出这是这个事件的触发,事件后的问号表示,如果事件为空就不触发的一种简单写法。

EventHandler

EventHandler,在.net6中感觉和Action的区别已经不大了,调用时有些差别(见下面代码)。之前的版本中只有用EventHandler定义的事件才能在Xaml中使用,在.net6使用Action定义的事件也可以在Xaml中使用了。

这里我定义了一个控件,并分别通过两种方式定义了事件

public class Class1 : Button
{
    public event Action EventTest;
    public event EventHandler<string> Event3;

    protected override void OnClick()
    {
        EventTest?.Invoke();
        Event3?.Invoke(this, "123"); // 事件的调用方式稍有不同
        base.OnClick();
    }

}

发现在前台Xaml都是可以直接使用的:

<local:Class1 EventTest="Class1_EventTest" Event3="Class1_Event3" >Class1</local:Class1>
private void Class1_EventTest()
{
    MessageBox.Show("Class1_EventTest");
}

private void Class1_Event3(object sender, string e)
{
    MessageBox.Show($"Class1_Event3: {e}");
}

小结:

可以说通过Action和EventHandle,自定义事件是相当的方便简单了。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF 中,自定义事件通常需要遵循以下步骤: 1. 定义一个路由事件:使用 `RoutedEvent` 类来定义路由事件,包括事件名称、路由策略和处理程序类型等信息。 2. 创建路由事件的包装器:使用 `EventManager.RegisterRoutedEvent` 方法创建一个路由事件的实例,并为其提供一个事件处理程序。 3. 添加路由事件处理程序:使用 `AddHandler` 方法将路由事件处理程序添加到控件或窗口中。 下面是一个简单的自定义事件示例: ``` // 定义路由事件 public static readonly RoutedEvent MyEvent = EventManager.RegisterRoutedEvent( "MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyControl)); // 创建路由事件的包装器 public event RoutedEventHandler MyEventHandler { add { AddHandler(MyEvent, value); } remove { RemoveHandler(MyEvent, value); } } // 触发路由事件 private void RaiseMyEvent() { RoutedEventArgs args = new RoutedEventArgs(MyEvent); RaiseEvent(args); } ``` 在上面的示例中,我们定义了一个名为 `MyEvent` 的路由事件,并为其提供了一个事件处理程序类型 `RoutedEventHandler`。我们还创建了一个名为 `MyEventHandler` 的包装器,使其能够添加和移除路由事件处理程序。最后,我们在 `RaiseMyEvent` 方法中使用 `RaiseEvent` 方法触发路由事件。 要使用自定义事件,只需要添加路由事件处理程序和调用 `RaiseMyEvent` 方法即可: ``` // 添加路由事件处理程序 myControl.MyEventHandler += new RoutedEventHandler(MyEventHandler); // 触发路由事件 myControl.RaiseMyEvent(); ``` 这里的 `MyEventHandler` 是我们自己定义的事件处理程序,它将在 `MyControl` 控件中触发 `MyEvent` 路由事件时被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code bean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值