zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

WPF事件 总结 自定义 Action
2023-09-11 14:14:50 时间

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,自定义事件是相当的方便简单了。