zoukankan      html  css  js  c++  java
  • 委托与事件

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

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

  • 相关阅读:
    蚂蚁金服SOFAMesh在多语言上的实践
    2018第48周日
    git只拉取github部分代码的方法
    深入理解brew link命令
    openssl/ssl.h file not found
    react热加载失败
    pycharm批量清楚pyc、$py.class文件
    Hash history cannot PUSH the same path; a new entry will not be added to the history stack
    JavaScript indexOf() 方法,获取元素的位置;Object.keys()获取对象的所有key的数组
    JavaScript删除数组里的某个元素
  • 原文地址:https://www.cnblogs.com/zhanying/p/3455444.html
Copyright © 2011-2022 走看看