系列目录:
1.委托和事件绑定
2.泛型委托
3.委托和多线程
接上文的例子,看看委托的方法订阅
public MainPage()
{
this.InitializeComponent();
Test();
}
public void Test()
{
SuperDeliveryCompany super = new SuperDeliveryCompany();
super.superMan.Invoke("地址", "138xxx");
//还可以在外面再次添加绑定方法,绑定一个lamd表达式匿名方法
super.superMan += (address,phoneNumber) => {Debug.WriteLine("Lamd"); return ""; };
super.superMan.Invoke("地址", "138xxx");
}
可以看到,我们在调用superMan委托之前,又给委托添加了绑定的方法. 先定义方法的原型,在外部定义原型中方法的具体内容,然后调用执行。想要做到这样,就要用到委托,在C#中所有的事件都是委托类型。我们先抛开C#事件编程的实际写法不管!看看纯用委托如何实现自定义事件!
为了方便,新建一个winform程序,新建一个UserControl自定义控件.代码这样写:
public partial class MyUserControl : UserControl
{
// 委托的原型
public delegate void Keypressed();
// 委托的实例
public Keypressed OnKeyPressed;
public MyUserControl()
{
InitializeComponent();
//页面的按键事件绑定MainPage_KeyDown方法
this.KeyDown += MyUserControl_KeyDown;
}
private void MyUserControl_KeyDown(object sender, KeyEventArgs e)
{
// 执行委托实例的方法
if (OnKeyPressed != null)
{
OnKeyPressed.Invoke();
}
// 简便的写法 OnKeyPressed?.Invoke();
}
}
很典型的委托写法,作用就是这个控件接收键盘按下事件的时候invoke执行委托的方法.而委托还没有赋值方法.然后在主程序中
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MyUserControl my = new MyUserControl();
this.Controls.Add(my);
my.OnKeyPressed += AlertKeyPress;
}
void AlertKeyPress()
{
MessageBox.Show("按下了键盘!");
}
}
添加自定义控件到主窗口,为委托绑定事件AlertKeyPress方法.运行程序.按下键盘任意按键,弹出了窗口.
回头再看实际上正常写法的自定义事件怎么写.
public delegate void ItemClick();
public event ItemClick OnItemClick;
public MyUserControl2()
{
InitializeComponent();
this.Click += MyUserControl2_Click;
}
private void MyUserControl2_Click(object sender, EventArgs e)
{
OnItemClick();
}
使用了event关键字,而触发委托的方式直接调用OnItemClick()方法即可.主窗口代码还是一样.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MyUserControl my = new MyUserControl();
this.Controls.Add(my);
my.OnKeyPressed += AlertKeyPress;
MyUserControl2 my2 = new MyUserControl2();
my2.Left = 300;
this.Controls.Add(my2);
my2.OnItemClick += UserControl2Clicked;
}
void AlertKeyPress()
{
MessageBox.Show("按下了键盘!");
}
void UserControl2Clicked()
{
MessageBox.Show("点击了UserControl2!");
}
}
点击自定义控件,同样触发了自定义事件.
这里应该可以明白了,虽然使用了event关键字简化了委托的写法.但本质上事件还是委托.事件绑定方法和委托所使用的运算符也是一样的.
当然事件和委托不可能就这么完了,下面准备说事件和泛型委托.