c# 深入理解事件1.0

定义:Event "事件"-----能够发生什么事件

角色:使对象或类具有通知能力的成员

使用:用于对象或类间的动作协调与信息传递(消息推送)

原理:事件模型(event model)中的两个“5”

         

“发生--响应”  中的五个部分    

  •    事件的拥有者(event  souse,对象)
  •    事件成员(event,成员)
  •    事件的响应者(event  subscriber, 对象)
  •    事件处理器(event handle,成员)---本质上是一个回调方法
  •    事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”

 “发生--响应” 中的五个动作 

  1.    我有一个事件    
  2.    一群人或一个人关心我的这个事件
  3.    我的这个事件发生了
  4.    关心这个事件的人会被通知到  
  5.    被通知到的人根据拿到的事件参数(“又称事件数据”“事件信息”“通知”)对事件进行响应(又称处理事件””)

 首先简单一个Demo看下事件的使用:

namespace EventExample
{
    class Program
    {
        static void Main(string[] args)
        {

            // 事件五要素:事件拥有者 timer;
            //             事件  Elapsed
            //             事件响应者 Boy对象
            //             事件处理器 Action方法
            //             事件订阅 

            Timer timer = new Timer();
            timer.Interval = 1000;
            Boy boy = new Boy();
            timer.Elapsed += boy.Action;
            timer.Elapsed += Girl.Action;
            timer.Start();
            Console.ReadLine();
        }
    }

    class Boy
    {
        internal void Action(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Jump!");
        }
    }

    class Girl
    {
        internal static void Action(object sender,ElapsedEventArgs e)
        {
            Console.WriteLine("Singing");
        }
    }
}
View Code

事件五个部分的组成关系

 (1)事件的拥有者和事件的响应者是完全不同的两个对象-

         MVC\MVP等设计模式的雏形

 

 

namespace Event1
{
    class Program
    {



        //事件拥有者 form
        //事件  Click
        //事件响应值 controller
        //事件处理器 FormClicked
        //订阅  this.form.Click += this.FormClicked;
        static void Main(string[] args)
        {

            Form form = new Form();

            Controller controller = new Controller(form);
            form.ShowDialog();
        }
    }


    class Controller
    {
        private Form form;

        public Controller(Form form)
        {
            if(form!=null)
            { 
               this.form = form;
               this.form.Click += this.FormClicked;
            }
        }

        private void FormClicked(object sender, EventArgs e)
        {
            this.form.Text = DateTime.Now.ToString();
        }
    }
View Code

 (2)事件的拥有者和事件的响应者是一个对象

 声明一个form对象,能否添加它的一个方法,自己处理它的click事件呢?

可以发现此时按 ctrl+“.” 已经无法出现智能提示,帮助我们自动生成事件处理器

原因:

因为form类是微软已经编写好的一个类,此时我们已经无法对它进行修改 ,解决办法是自己声明一个类去继承form类

static void Main(string[] args)
        {

            MyForm form = new MyForm();
            form.Click += form.FormClicked;

            form.ShowDialog();
          
        }
    }

    class MyForm : Form
    {
        internal void FormClicked(object sender, EventArgs e)
        {
            this.Text = DateTime.Now.ToString();
        }
    }
View Code

 (3)最常见的是这种,事件拥有者是事件响应者的一个字段成员,事件的响应者用自己的一个方法订阅着自己的字段成员的某个事件。

Demo:在一个窗口里有一个文本框和一个按钮,点击按钮,文本框显示“Hello World”

              微软为我们准备的窗口form类进行显示的时候就是一个光板

              此时若我们想为他添加按钮【即想让一个类既具有某个类的功能,又想添加新的功能,即派生(类的继承)】

   

 

        //事件拥有者button

        //事件 Click

        //事件响应者  MyForm的对象

        //事件处理器 ButtonClicked

        //订阅

这个非可视化编程,只是为了理解好这个模型。

可视化编程:用vs的所见即所得的winform。手动添加事件处理器拖拉控件到窗体

右击打开代码

声明方法

namespace WindowsFormsApp2
{
    public partial class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
            this.myButton.Click += MyButton_Click;
        }

        private void MyButton_Click(object sender, EventArgs e)
        {
            this.myTextbox.Text = "Hello World";

        }
    }
}

 自动添加事件处理器:点击button按钮   然后到属性栏,点击小,可以找到click事件,直接双击即可生成

namespace WindowsFormsApp2
{
    public partial class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
            
        }


        private void MyButton_Click_1(object sender, EventArgs e)
        {
            this.myTextbox.Text = "Hello World";

        }
    }
}

 可以发现事件订阅不在代码中,因为在后台代码中

 一个练习的Demo

  

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
              this.button3.Click += new EventHandler(this.ButtonClick);

       }
           



        private void ButtonClick(object sender, EventArgs e)
        {
            if(sender==button1)
            {
                this.textBox1.Text = "Hello";
            }

            if (sender == button2)
            {
                this.textBox1.Text = "World";
            }

            if (sender == button3)
            {
               this.textBox1.Text = "Haha";
            }
        }
    }
}
View Code

其他学习点:

事件挂接多种方式

(1)用 “+=”

 this.button3.Click += this.ButtonClick;

(2)用EventHandler委托

  this.button3.Click += new EventHandler(this.ButtonClick);

(3)匿名方法(已过时)

     

 this.button3.Click += delegate (object sender, EventArgs e)
{

 this.textBox1.Text = "Mr.right";

 };

 //注意分号别忘了   

  (3)  lamda

this.button3.Click += (object sender, EventArgs e) =>{
this.textBox1.Text = "Me.right"; 
}; 

思考:

一个事件可不可以挂接多个事件处理器 ---可以 (第一个timer的例子)

 

一个事件处理器可不可以被多个事件挂接---可以 (ButtonClick处理器被多个button挂接)  

 

 

以上学习了事件模型的五个组成部分及其常见的组合方式,以及如何使用厂商为我们准备好的事件。如button的click事件, timer的Elapsed事件

 

 # 自律即是自由 #

 

猜你喜欢

转载自www.cnblogs.com/lxq6701/p/11364718.html