zoukankan      html  css  js  c++  java
  • 事件

    事件
    事件就是封装了委托;
    
    定义一个事件,自动生成了一个私有的委托,还有个委托的方法,addEvent 跟 removeEvent;
    
    怎么使用事件的列子:
    
    1.public event EventHandler TriggerClick;//定义一个事件
    
    2.在用户定义的控件里使用该事件:
    
    if(TriggerClick!=null)//触发事件之前先判断事件是否注册了(是否+=了)
    {
    TriggerClick(this,e);    
    }
    
    //注册事件(其实就是给事件所指向委托添加方法)
    3.triggerButton1.TriggerClick += new EventHandler(triggerButton1_TriggerClick);
    
    
    void triggerButton1_TriggerClick(object sender,EventArgs e){ }
    
     
    
    用委托实现事件做的:
    
    1. public delegate void DelTriggerClick(object a, object b);
    private DelTriggerClick delTrigger;
    public void AddEvent(DelTriggerClick delTrigger)
    {
    this.delTrigger += delTrigger;
    }
    public void RemoveEvent(DelTriggerClick delTrigger)
    {
    this.delTrigger -= delTrigger;
    }
    
    2.    if (delTrigger != null)
    {
    delTrigger(sender, e);
    }
    
    3. ucDelTriggerClick2.AddEvent(Trigger);
    
    void Trigger(object a, object b)
    {
    MessageBox.Show("你点了3次!");
    }

            遇到比较难理解的内容时,我们就把它最简单的用法弄明白,再逐渐学习它的一些真正有用的内容。

            事件的作用就是来帮你完成任务,完成你想做得事。假如我们想点击一个按钮时弹出一个对话框,点击播放按钮时它就播放音

     乐, 也就是说我们点一个按钮后想要实现什么效果,就可以用事件来帮我们完成。

            我们知道了事件可以帮我们做我们想做的事情,那么事件怎么用呢?它需要什么条件呢?

       很简单,要把大象装冰箱,总共分几步?答案,3步:

         1. 定义事件

         2. 注册事件

         3. 调用事件

    Player
    class Player
        {
            // 1 定义事件 (播放完之后要做什么由调用的来决定,是播放下一首,还是关闭等等。。。 )
            public event EventHandler PlayOver;
            public Player() { }
            public Player(string name)
            {
                this.name = name;
            }
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public void Play()
            {
                Console.WriteLine("正在播放");
                if(PlayOver!=null)
                {
                    //2. 调用事件
                    PlayOver(this, null);
                }
            }
        }
    Program
    class Program
        {
            static void Main(string[] args)
            {
                Player play = new Player("想你的夜");
                // 3.注册事件(给事件的委托加方法,播放完是结束,还是进行一下一首。。。)
                play.PlayOver += new EventHandler(play_PlayOver);
                play.Play();
            }
    
            static void play_PlayOver(object sender, EventArgs e)
            {
                Console.WriteLine("播放结束");
            }
        }

           事件就是这么简单,我们在学习知识的时候总是会遇到让我们弄不懂的地方,为什么有的人可以快速的学会,有的人却怎么学都感觉不会,总是感觉有一层迷雾遮住了你的思想,让你想不通,看不透,其实只要我们自己认为自己可以做到,就一定可以做到,如果你自己都认为自己做不到,或者是想时间久了就自然明白了,那么这个问题也许就会一直迷雾着你,让你永远看不透。有些东西,你说难,它就难,不难也难!你说易,它就易,难也不难!如果我们把每个问题都当做是老虎,你不解决它,它就吃了你,那么我想你就第二个武松,第二个爱因斯坦,因为很少会有人想问题把自己想死的吧,问题是你创造的,你就是创世主,当然也有解决它的能力!

       回到正题:我们来看看下面这些东西

       private void button1_Click(object sender, EventArgs e)

       private void Form1_Load(object sender, EventArgs e)

       private void textBox1_TextChanged(object sender, EventArgs e)

      你会感慨的说:“我靠,怎么这么熟?!”

          单机按钮,就会触发事件,系统就会自动调用该事件的处理程序button1_Click(),我们把触发事件的对象称为事件的发送者(Event Sender),响应事件的对象称为事件的接受者(Event Receiver). 我们点击按钮弹出一个消息框,那么,事件的发送者就是按钮,事件的接受者就是窗体From1.

      当事件发生时,系统是如何找到对应的事件处理程序呢?原来.NET以委托机制运行事件处理程序。.NET中预先定义了许多种专门用于事件的委托类型,比如EventHandler、KeyEventHandler、MouseEventHandler等。

      我们查看Control类,就会发现该类定义了大量事件成员:

      其中有我们很熟悉的Click、DoubleClicks、MouseMove、MouseClick等。

      public event EventHandler Click
      public event EventHandler DoubleClick
      public event EventHandler Enter
      public event MouseEventHandler MouseMove
      public event MouseEventHandler MouseClick

      从声明过程中可以看出,“事件”实际上就是一个委托的实例,只是声明事件时必须用event关键字,因为.NET中所以控件都继承于Control类,故所有的控件都拥有这些事件。

      当我们在类From1中定义了button1_Click()函数之后,系统怎么知道这个函数就是button1的Click事件处理程序呢?原来系统通过下面的语句把函数button1_Click()注册到button1.Click事件中。

      this.button1.Click += new System.EventHandler(this.button1_Click);

      

    打开Windows 窗体设计器生成的代码,我们拖到窗体上的所以控件都帮我们自动生成了

        

      从上面的注册事件,我们可以看出,事件能指向什么方法,就是通过委托来决定的,我们来看一下Click事件的EventHandler委托:

          public delegate void EventHandler(object sender, EventArgs e);

      你又会感慨:“我靠,怎么这么熟悉?!”  对,你用了“又”,所以在来看一下上面你所感慨的东西。

       private void button1_Click(object sender, EventArgs e)

      现在终于知道为什么button1_Click()这个的函数的参数是(object sender, EventArgs e),返回值是void了吧!

      原来根源就在Click事件的委托的签名就是这个样子。

      参数:  这个委托的函数接收两个参数,一个是发送事件的发送者,一个是事件本身的参数。

       sender发送者,点按钮,那么sender就是按钮,点鼠标,那么sender就是鼠标这个对象。

       EventArgs这个类就是一个“鸡肋”,它就是一个父类,让别的类去继承它。

      现在事件我们应该都明白了,可以写一个自定的事件,让上面那个播放器的显示正在播放的歌曲:

    View Code
     public class SongEventArgs : EventArgs
        {
            public SongEventArgs() { }
            public SongEventArgs(string name)
            {
                this.name = name;
            }
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }
        delegate void PlayOverEventHandler(object sender, SongEventArgs e);
        class Player
        {
            // 1 定义事件 (播放完之后要做什么由调用的来决定,是播放下一首,还是关闭等等。。。 )
            public event PlayOverEventHandler PlayOver;
            public Player() { }
            public Player(string name)
            {
                this.name = name;
            }
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public void Play()
            {
                Console.WriteLine("正在播放"+this.name);
                if(PlayOver!=null)
                {
                    //2. 调用事件
                    PlayOver(this,new SongEventArgs(this.name));
                }
            }
        }
    View Code
     class Program
        {
            static void Main(string[] args)
            {
                Player play = new Player("想你的夜");
                // 3.注册事件(给事件的委托加方法,播放完是结束,还是进行一下一首。。。)
                play.PlayOver += new PlayOverEventHandler(play_PlayOver);
                play.Play();
                Console.Read();
            }
    
            static void play_PlayOver(object sender, SongEventArgs e)
            {
                Console.WriteLine(e.Name+"播放结束");
            }
        }

      

    
    

         

  • 相关阅读:
    人工智能第三课:数据科学中的Python
    人工智能第二课:认知服务和机器人框架探秘
    人工智能第一课:使用分类算法预测糖尿病
    如何加入Microsoft Teams 技术社区
    Python在Office 365 开发中的应用
    《Office 365开发入门指南》上市说明和读者服务
    基于Microsoft Graph打造自己的Timeline应用
    Office 365 应用开发的 .NET Core 模板库
    拥抱开源,Office 365开发迎来新时代
    Excel as a Service —— Excel 开发居然可以这么玩
  • 原文地址:https://www.cnblogs.com/hejinyang/p/2804769.html
Copyright © 2011-2022 走看看