• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    .NET图像界面按钮的clicked事件浅谈

        但是事件并不局限于图像界面,也可能是满足程序的某个逻辑判断触发了事件。引发事件的对象叫做事件发送方,捕获事件并对其做出响应的对象叫做事件接收方。但是事件发送方并不知道哪个对象或者方法会处理它引发的事件,所以需要在事件发送方和事件接收方之间存在一媒介,明确某个对象或者某个类型的某个方法会对这个事件进行响应。.NET用委托作为事件发送方与事件接收方之间的媒介,委托只有一个签名,只要方法签名与委托签名匹配的方法,都可以声明自己对这个委托类型的事件的感兴趣,接收并处理它。
    事件发送方的对象为了给事件接收对象传递一些额外信息,就需要写一个派生于System.EventArgs的类,封装一些数据。

    复制代码 代码如下:

        public class DrawEventArgs:EventArgs
        {
            privatedouble m_Size;
            public DrawEventArgs(doublesize)
            {
                m_Size = size;
            }
            public double Size
            {
                get
                {
                    returnm_Size;
                }
            }
        }

    下面声明一委托,该委托有两个参数,一个是参数代表事件的发送方,另一个是参数是该事件封装的数据。
    public  delegate void ShapeSizeChanged(objectsender,DrawEventArgs e);
    ShapeSizeChanged的实例可以绑定到任何和它方法签名匹配的方法上。
    下面是自定义事件委托,
    public event ShapeSizeChanged SizeChanged;
    下面是一个负责引发事件的类型代码,
    复制代码 代码如下:

        public class DrawManager
        {
            public event ShapeSizeChangedSizeChanged;
            protectedvoid OnSizeChanged(DrawEventArgse)
            {
                ShapeSizeChangedtemp = SizeChanged;
                //是否有委托与该事件关联
                if(temp != null)
                {
                    temp(this,e);
                }
            }
            public void SizeChange(doublesize)
            {
                DrawEventArgse = new DrawEventArgs(size);
                OnSizeChanged(e);
            }
        }


    而后定义两个监听事件的类型,
    复制代码 代码如下:

        public class Square
        {
            publicSquare(DrawManager drawManager)
            {
                //drawManager.SizeChanged+= DrawSquare;
                //把事件关联到委托上
                drawManager.SizeChanged += new ShapeSizeChanged(DrawSquare);
            }
            public void DrawSquare(objectsender, DrawEventArgs e)
            {
                Console.WriteLine(string.Format("TheSquare'Length = {0}", e.Size));
            }
            public void Detach(DrawManagerdrawManager)
            {
                //drawManager.SizeChanged-= DrawSquare;
                //解除事件和委托的关联
                drawManager.SizeChanged -= new ShapeSizeChanged(DrawSquare);
            }
        }
        public class Rectangle
        {
            publicRectangle(DrawManager drawManager)
            {
                drawManager.SizeChanged +=DrawRectangle;
            }
            public void DrawRectangle(objectsender, DrawEventArgs e)
            {
                Console.WriteLine(string.Format("TheRectangle'length={0} and width={1}.",e.Size*2,e.Size));
            }
            public void Detach(DrawManagerdrawManager)
            {
                drawManager.SizeChanged -=DrawRectangle;
            }
        }

    测试代码,
    复制代码 代码如下:

        class Program
        {
            static void Main(string[]args)
            {
                DrawManagerdrawManager = new DrawManager();
                Rectanglerect = new Rectangle(drawManager);
                Squaresquare = new Square(drawManager);
                //引发事件
                drawManager.SizeChange(5);

                //解除监听事件
                square.Detach(drawManager);
                drawManager.SizeChange(10);
                Console.ReadLine();
            }
        }
    /*运行结果
      The Rectangle'length=10 and width=5.
      The Square'Length = 5
      The Rectangle'length=20 and width=10.
     */

    .NET中的事件模式和观察者模式非常相似,也可谓是观察者模式在.NET下的进化版吧,下面用观察者模式实现上面功能以做对比,首先定义两个接口,IObserver和IObservable,如下
    复制代码 代码如下:

    public interface IObserver
        {
            voidNotify(DrawEventArgs e);
        }
        public interface IObservable
        {
            voidRegister(IObserver observer);
            voidUnRegister(IObserver observer);
        }

    下面是改写后的两个观察者类,
    复制代码 代码如下:

        public class NewRectangle:IObserver
        {
            privateObserverManager m;
            publicNewRectangle(ObserverManager oManager)
            {
                m=oManager;
                oManager.Register(this);
            }
            public void Notify(DrawEventArgse)
            {
                Console.WriteLine(string.Format("TheRectangle'length={0} and width={1}.", e.Size * 2, e.Size));
            }
            public void Detach()
            {
                m.UnRegister(this);
            }
        }
        public class NewSquare:IObserver
        {
            privateObserverManager m;

            publicNewSquare(ObserverManager oManager)
            {
                m=oManager;
                oManager.Register(this);
            }
            public void Notify(DrawEventArgse)
            {
                Console.WriteLine(string.Format("TheSquare'Length = {0}.", e.Size));
            }
            public void Detach()
            {
                m.UnRegister(this);
            }
        }

    下面是负责通知观察者的类型,
    复制代码 代码如下:

        public class ObserverManager:IObservable
        {
            protectedArrayList arrList;
            publicObserverManager()
            {
                arrList = newArrayList();
            }
            public void Register(IObserverobserver)
            {
                arrList.Add(observer);
            }
            public void UnRegister(IObserverobserver)
            {
                if(arrList.Contains(observer))
                {
                    arrList.Remove(observer);
                }
            }
            public void NotifyObservers(doublesize)
            {
                DrawEventArgse = new DrawEventArgs(size);
                foreach(IObserver observer inarrList)
                {
                    observer.Notify(e);
                }
            }
            public void SizeChanged(doublesize)
            {
                NotifyObservers(size);
            }
        }

    下面是调用代码,
    复制代码 代码如下:

            static void Main(string[]args)
            {
                ObserverManageroManager = new ObserverManager();
                NewRectanglerect = new NewRectangle(oManager);
                NewSquaresquare = new NewSquare(oManager);
                oManager.SizeChanged(5);
                square.Detach();
                oManager.SizeChanged(10);
         Console.ReadLine();
            }

    最好运行下代码,这样可以更easy的理解这两种模式微妙的差别了。
    对事件来说,还可以显式的用add和remove编写事件访问器,事件访问器通常有编译器生成,所以可以显式的用事件访问器修改DrawManager类型,
    复制代码 代码如下:

        public class DrawManager
        {
            privateevent ShapeSizeChangedm_SizeChanged;
            privatereadonly objectm_lock = new object();
            public event ShapeSizeChangedSizeChanged
            {
                add
                {
                    lock(m_lock)
                    {
                        m_SizeChanged += value;
                    }
                }
                remove
                {
                    lock(m_lock)
                    {
                        m_SizeChanged -= value;
                    }
                }
            }
            protectedvoid OnSizeChanged(DrawEventArgse)
            {
                ShapeSizeChangedtemp = m_SizeChanged;
                //是否有委托与该事件关联
                if(temp != null)
                {
                    temp(this,e);
                }
            }
            public void SizeChange(doublesize)
            {
                DrawEventArgse = new DrawEventArgs(size);
                OnSizeChanged(e);
            }
        }

    您可能感兴趣的文章:
    • asp.net在事件中启动线程来打开一个页面的实现方法
    • asp.net页面触发事件panel滚动条高度不变的实现方法
    • ASP.NET中实现定制自己的委托和事件参数类
    • .NET WinFrom中给文本框添加拖放事件的代码
    • .net自定义事件示例分享
    • 详解ASP.NET页面生命周期事件
    • ASP.NET 页面事件执行顺序介绍
    • .net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
    • .Net WInform开发笔记(五)关于事件Event
    • .NET中基于事件的异步模式-EAP
    • .NET事件监听机制的局限与扩展分析
    上一篇:ajaxToolkit:AccordionPane演示与应用实例
    下一篇:asp.net中Word转Html的办法(不需要WORD组件)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    .NET图像界面按钮的clicked事件浅谈 .NET,图像,界面,按钮,的,