1.什么是事件?

          我们可以将事件简单的看作是一个事物从一个状态变为另一个状态的过程,比如按键在弹起状态,按键按下,这是一个事件

按键弹起也是一个事件。在c#中的事件我们可以理解为程序的执行状态的改变或程序变量的改变,当一个程序执行检测到状态的

改变而引起另一个程序的执行。这就是事件触发和事件处理程序 ,

 

2.事件和事件处理是如何实现的?

          事件是依靠委托来实现的,我们可以将事件和事件处理看作两个不同的处理程序,一个用来监控和触发事件处理程序,一个用来接收和处理。一般我们将监控和触发的程序叫做事件发生器。当事件发生时我们通过委托来将需要处理的动作交给另一个程序来执行。

3. 声明事件的基本格式

    修饰符 event 委托代理名 事件名

例如:

        //声明事件委托
        public delegate void MyEventHandler(object o);
            //声明事件
            public event MyEventHandler MyEvent;

3.在理解了事件的基本概念我们来实现一个自定义事件。

3.1实现自定义事件的基本规则

3.1.1     声明关于事件的委托;

3.1.2      声明事件;

3. 1.3     编写触发事件的函数;

3. 1.4.     创建事件处理程序;

3. 1.5.     注册事件处理程序;

3. 1.6.     在适当的条件下触发事件。 

 

3.2下面通过代码据体实现

在这里我们实现一个简单的按键处理程序

1.声明一个事件委托

       //声明按键按下的委托
public delegate void KeyDownHandle(object sender, KeEventArgs e);

2.声明事件

       //声明事件
        public event KeyDownHandle KeyDown;

3.触发事件的方法

        public void Run()
        {
            bool finished = false;
            do
            {
              Console.WriteLine("Input a char");
              string response = Console.ReadLine();
              char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
              switch (responseChar)
              {
                  case 'X':
                      finished = true;
                      break;
                  default:
                    
                     KeEventArgs keyEventArgs = new KeEventArgs(responseChar);
//触发事件处理程序 KeyDown(
this, keyEventArgs); break; } } while (!finished); }

4.创建事件处理程序

        //按键按下的处理程序
        private void OnKeyDown(object sender, KeEventArgs e)
        {
            //输出按键按下的字符
            Console.WriteLine("Capture key: {0}", e.KeyChar);
        
        }

5.注册事件

            //注册事件
            keMonitor.KeyDown += new EventHandleDemo.KeyMonitor.KeyDownHandle(OnKeyDown);

6.执行程序

        {
            KeyMonitor Monitor = new KeyMonitor();

            EventHandler EventHandle = new EventHandler(Monitor);

            Monitor.Run();

        }

 

4程序完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventHandleDemo
{
    class EventMain
    {
        static void Main(string[] args)
        {
            KeyMonitor Monitor = new KeyMonitor();

            EventHandler EventHandle = new EventHandler(Monitor);

            Monitor.Run();

        }
    }
    /// <summary>
    /// 存储按键信息
    /// </summary>
    internal class KeEventArgs : EventArgs
    {
        private char keyChar;

        public char KeyChar
        {
            get { return keyChar; }
            set { keyChar = value; }
        }

        public KeEventArgs(char keyChar) 
        {
            this.keyChar = keyChar;
        }

    }
    
    
    
    internal class KeyMonitor

    {
        //声明按键按下的委托
        public delegate void KeyDownHandle(object sender, KeEventArgs e);
        //声明事件
        public event KeyDownHandle KeyDown;

        //监控按键和触发事件的方法
        public void Run()
        {
            bool finished = false;
            do
            {
              Console.WriteLine("Input a char");
              string response = Console.ReadLine();
              char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
              switch (responseChar)
              {
                  case 'X':
                      finished = true;
                      break;
                  default:
                    
                     KeEventArgs keyEventArgs = new KeEventArgs(responseChar);
                    
                      //触发事件
                      KeyDown(this, keyEventArgs);
                      break;
              }


            } while (!finished);

        }    
   
    }

    internal class EventHandler
    {
        //按键按下的处理程序
        private void OnKeyDown(object sender, KeEventArgs e)
        {
            //输出按键按下的字符
            Console.WriteLine("Capture key: {0}", e.KeyChar);
        
        }
        //构造函数
        public EventHandler(KeyMonitor keMonitor)
        {
            //注册事件
            keMonitor.KeyDown += new EventHandleDemo.KeyMonitor.KeyDownHandle(OnKeyDown);
        
        }

    
    }

}