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

  • 相关阅读:
    20169207 2016-2017-2 《移动平台应用开发实践》第五周学习总结
    20169212 2016-2017-2《网络攻防实践》第八周学习总结
    20169212 2016-2017-2 《网络攻防实践》第七周学习总结
    20169212 2016-2017-2 《网络攻防实践》第六周学习总结
    20169212 2016-2017-2 《网络攻防实践》第五周学习总结
    20169212 2016-2017-2 《网络攻防实践》第四周学习总结
    20169212 2016-2017-2 《网络攻防实践》第三周学习总结
    20169212 2016-2017-2 《网络攻防实践》第二周学习总结
    20169212《网络攻防实践》第一周学习总结
    20169212《Linux内核原理与分析》课程总结
  • 原文地址:https://www.cnblogs.com/zhanying/p/3455444.html
Copyright © 2011-2022 走看看