事件处理的本质

当在点击一个按钮执行某个操作时,你有没有想过,为什么点击了这个按钮就会执行某个操作,这是为什么?那么接下来就让我来解开这里面的秘密。
用微软中定义的事件函数来说明这个问题是再简单不过的的事情了。
首先,点击按钮是一个事件,也就是说,当你点击了按钮就相当于是触发了一个事件,学过C#窗体编程的同学都知道,事件是其中常用一个属性,按钮的触发就使用了这个属性。
不闲谈了,解决实际的问题。
将按钮的整个过程分开为两个过程,1.按钮点击事件发生。2.执行事件函数,完成相应的操作。可以想象一下,这两个过程在分开时都可以方便地实现,第一条只需要创建一个按钮点击区域,来检测鼠标或触碰是否在本按钮区域之内即可,第二条也只需要创建一个事件处理函数即可。关键是怎样在这两点之间架起一个传递信息的桥梁,事件发生时怎样调用事件处理函数。
接下来是干货,话不多说直接上代码:
这是一个窗体程序,实现的基本工能是,创建一个按钮Button,创建一个文本输入框TextBox,创建一个显示文本条Label。程序中预先设置好一个体重基础值weight。当在文本中输入一个数值后,点击button按钮,程序内部判断这个值是大于原先设置的值,还是小于原先设置的值,如果大于原先设置的值就在label中显示“小明变胖了,现在的体重是”同时再把这个值给这个给weight。如果小于这个值就显示“小明变瘦了,现在体重是”同时把这个值给weight。借这个程序来说明按钮的执行本质。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _13._6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void WeightChangedEventHandler(object sender, EventArgs e);
        class Woman
        {
            #region 构造函数
            public Woman(string n,int a,double w)
            {
                _name = n;
                _age = a;
                _weight = w;
            }
            #endregion

            #region 事件
            public event WeightChangedEventHandler GetFatter;
            public event WeightChangedEventHandler GetThinner;
            #endregion
            #region 属性
            private string _name;           
            public string Name1
            {
                get
                {
                    return _name;
                }
                set
                {
                    _name = value;
                }
            }
            private int _age;
            public int Age
            {
                get
                {
                    return _age;
                }
                set
                {
                    if (value < 15 || value > 60)
                    {
                        throw new ArgumentOutOfRangeException("输入的年龄不合理");
                    }
                    _age = value;
                }
            }
            private double _weight;
            public double Weight
            {
                get
                {
                    return _weight;
                }
                set
                {
                    if (value < 30 || value > 200)
                    {
                        throw new ArgumentOutOfRangeException("输入的体重不合适");
                    }
                    double originalWeight = _weight;
                    _weight = value;
                    if (value > originalWeight)
                    {
                        if (GetFatter != null)
                        {
                            GetFatter(this, EventArgs.Empty);
                        }
                    }
                    else
                    {
                        if (value < originalWeight)
                        {
                            if (GetThinner != null)
                            {
                                GetThinner(this, EventArgs.Empty);
                            }
                        }
                    }
                }
            }
            #endregion
        }
        Woman mary;
        private void Form1_Load(object sender, EventArgs e)
        {

            mary = new Woman("小明", 23, 64.5f);
            mary.GetFatter += new WeightChangedEventHandler(GetfatterHandler);
            mary.GetThinner += GetthinnerHandler;
            System.Console.WriteLine("说明此处是 代码加载时执行的");
        }
        private void GetfatterHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "变胖了,现在体重" + woman.Weight + "kg.\r\n");
        }
        private void GetthinnerHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "变瘦了,现在体重" + woman.Weight + "kg.\r\n");
        }

        private void button(object sender, EventArgs e)
        {
            double d;
            if(double.TryParse(textBox1.Text,out d))
            {
                try
                {
                    mary.Weight = d;
                }
                catch (ArgumentOutOfRangeException) { }
            }
        }
    }
}

在weight属性中可以发现调用了事件处理函数,在Form1_Load(object sender, EventArgs e)函数中将对应的事件发生时要执行的函数加载到自身的函数上,这一步才是整个按钮执行的关键一步,这一步利用了事件的装订,来触发相应的事件执行函数。这个函数是在函数执行时直接加载执行的函数。

阅读更多
上一篇记一次线性插值方法(Mathf.Lerp())的使用体会
下一篇`vector3.angle(vector3 from,vector3 to)`使用的认知
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭