【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,自定义事件是相当的方便简单了。
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。