利用委托来实现鼠标三击效果。用户控件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public delegate void SanqianDelegate();//声明委托类型,访问限制符+delegate+返回值类型+名称(参数列表); public partial class Sanqiangbutton : UserControl { private int clickCount = 0;//记录点击次数 public SanqianDelegate OnSanQiang;//实例化委托onsanqiang public Sanqiangbutton() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { clickCount++; if (clickCount == 3)//当点击次数==3的时候一个方法被触发了,在此时我们不知道这个方法是什么,我们只知道这个方法 //大概的样子,就是参数是什么样子的,返回值是什么样子的,委托就模糊的代理了这个方法。 { if (OnSanQiang != null)//判断委托是否有指向至少一个函数,否则程序会报错 { OnSanQiang(); } clickCount = 0; } } } }
然后
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); sanqiangbutton1.OnSanQiang = Onsanqian1;//现在是把用户控件中的OnSanQiang委托指向 //onsanqiang1和onsanqiang2 sanqiangbutton1.OnSanQiang += Onsanqian2;//这里就只需要写方法,用户控件就只需要知道 //这个方法返回什么,什么参数就行了 } void Onsanqian1() { MessageBox.Show("三击触发"); } void Onsanqian2() { MessageBox.Show("多播委托"); } } }
这样就初步实现了鼠标三击的事件大概样子。但是这样是有问题的,把委托作为字段放进类里面,我们知道字段在任何情况下都不可以声明为public,这样是不安全的,我甚至可以直接把委托赋值为null或者直接伪造事件OnSanQiang()。所以我们要把字段声明为private,然后来一个public方法传递。
private SanQiangDelegate OnSanQiang; //委托声明为private,这样外界就无法=null或者OnSanQiang()伪造事件 //外界只能调用AddSanQiang添加监听 public void AddSanQiang(SanQiangDelegate d) { OnSanQiang += d; }
到这里已经类似于“属性”的演变方式了。因为到这里微软提供了简化的写法,称之为事件。
private SanqianDelegate OnSanQiang; public event SanqianDelegate OnSanQiangSJ ////声明事件的标准语法 ////event 委托类型 事件名{add remove} ////事件成员可以用+=、-=调用add、remove方法 { add { OnSanQiang += value; } remove { OnSanQiang -= value; } } //add remove最终也是编译生成两个方法 // //当用户sanQiangButton1.OnSanQiang += _SAnQiang1添加监听的时候 // //就会调用add方法,value就是添加的委托
然后喜闻乐见就又给简化成一句话。
public event SanQiangDelegate OnSanQiang;
//微软提供的简化写法。
//编译器自动生成一个private 委托成员和add、remove方法
//和简写的属性微软做的事情一样
//和public SanQiangDelegate OnSanQiang;不一样