个人资料

主页 博客 留言板 搜索
跳过导航链接首页 > 博客列表 > 博客正文

C#基础学习,继续说委托,委托和自定义事件

分类

系列目录:

0.从delegete委托开始说起

1.委托和事件绑定

2.泛型委托

3.委托和多线程

4.委托和async/await异步等待



上文的例子,看看委托的方法订阅

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关键字简化了委托的写法.但本质上事件还是委托.事件绑定方法和委托所使用的运算符也是一样的.

当然事件和委托不可能就这么完了,下面准备说事件和泛型委托.



songshizhao
最初发表2018/6/13 20:57:15 最近更新2018/6/13 20:57:15 533
为此篇作品打分
10