委托与事件

利用委托来实现鼠标三击效果。用户控件

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;不一样

 

posted @ 2013-12-03 11:29  南瓜asp  阅读(183)  评论(0)    收藏  举报