Action和EventHandler都是.net帮我定义好的委托,我们可以直接使用,方便的定义事件。
- //无参事件
- 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,在.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" >Class1local:Class1>
- private void Class1_EventTest()
- {
- MessageBox.Show("Class1_EventTest");
- }
-
- private void Class1_Event3(object sender, string e)
- {
- MessageBox.Show($"Class1_Event3: {e}");
- }
可以说通过Action和EventHandle,自定义事件是相当的方便简单了。