zoukankan      html  css  js  c++  java
  • C#中的建立事件

        我想學一下如何定議事件,找了一篇文章學習,可是沒看懂,不過感覺這篇文章挺好,就留下來了。

    目录:
       介绍委托和事件
       声明事件(定义事件)
       注册事件
       实现事件
       触发事件
       为事件增加“添加/删除”方法 

    一  介绍委托和事件

    事件是特殊化的委托,委托是事件的基础,所以在介绍事件之前先介绍一下委托。

    委托:使用委托可以将方法应用(不是方法)封装在委托对象内,然后将委托对象传递给调用方法的代码,这样编译的时候代码就没有必要知道调用哪个方法。通过使用委托程序能够在运行时动态的调用不供的方法。
     
    事件:事件是对象发送的消息,发送信号通知客户发生了操作。这个操作可能是由鼠标单击引起的,也可能是由某些其他的程序逻辑触发的。事件的发送方不需要知道那个对象或者方法接收它引发的事件,发送方只需知道在它和接收方之间存在的中介(Deletgate) 

    二. 声明事件(定义事件)

    在GUI图形界面中的事件(单击按钮或者选择菜单等)是已经定义好的事件,所需要的就是注册事件。我们也可以自己定义声明事件,可以将自己定义的事件应用到程序的任何地方。事件和委托是分不开的,c# 中使用委托来声明事件。

    如果在类里面声明事件,那么必须先声明该事件的委托类型,也可以使用一个事先已经声明好的委托类型。

    下面是一个声明事件的例子:
    using system;

    public delegate void MenuHandler()  //事先申明一个委托,也可以在类的内部声明委托类型

    public class Menuitem            //声明一个菜单项目的类

    {
          
    public event MenuHadler MenuSelection;// 声明一个事件并指定它的委托类型
          
    string  text ;//声明一个字符串
          
    public MenuItem(string text)     //菜单项目类的构造函数
          {
          
    this.text=text;                // 初始化text字符串
          }     

          public void Fird()
          {
            MenuSelection;               
    //定义一个触发事件的方法(后面将用到)
          }
          public string Text                //定义属性
          {
           
    get
           {      
            return text;
           }
           set
           {
           text
    =value;
           }
    }
    }

    程序首先定义个一个叫做MenuHandler的委托,然后定义了叫做 MenuItem 的类,MenuItem类包含了一个MenuSelection 事件(菜单被选择事件),事件的委托类型是MenuHandler。事件的声明完成啦,下面开始注册事件

    三.注册事件

    这里先讲一下 publisher/subscriber(发布者/订阅者)模式,因为事件就是从这个模式继承下来的。一個訊息的傳送者 (Sender) 稱之為 Publisher,而該訊息的接收者 (Receiver),則稱之為Subscriber,Subscriber(订阅者)在Publisher(发布者)处注册自己,Publisher发 生改变的时候,通知Subscriber做适当的操作,很类似设计模式中的Observer 。

    在这里我们认为注册的程序就是订阅者(Subscriber)。事件相当于发布者(Publisher),下面的程序表明了如何把订阅器连接到发布器:
    using system;

    public class DelegateAndEvents     //定义个注册事件的类

    {
           
    public static void int Main ()
           {
                 SiteManager sm
    =new SiteManager (); // SiteManager是一个站点管理类
                 MenuItem AddMenu
    = new MenuItem(“Add”) //定义一个新的事件类
                 MenuItem DelMenu
    =new MenuItem(“Delete”) //定义另外一个新的事件类
               
    //通过委托,sm类的Addsite 方法 注册到事件中
                AddMenu.MenuSelelction
    +=new MenuHandler(sm.AddSite)
               
    //通过委托,sm类的DeleteSite 方法 注册到事件中
                 DelMenu.MenuSelelction+=new MenuHandler(sm. DeleteSite)
            }
    }

    从注册事件的那行代码来看,事件就像是事件类的一个字段(属性),但是对它的访问是很受限制的,只能通过:在该字段上撰写新的委托(+=)或者从字段(可能是复合字段)移除委托(-=)进行访问,
    移除注册事件:DelMenu.MenuSelelction-=new MenuHandler(sm. DeleteSite)

    四.实现事件

    这里就要讲到上个例子中的SiteManager类,它包含了事件需要实现的方法(AddSite,DeleteSite),SiteManager类的方法一定要符合事件的委托类型和返回类型,在委托添加到事件前,该方法能够以这个方式付给委托。
    using system;
    public class SiteManger  //站点管理类
    {
           
    public SiteManger()         //构造函数 初始化变量
            {
                   
    //impelement something
            }
            public void AddSite()    //方法要符合委托的类型
            {
            // impelement  执行添加站点的操作代码
            }
            public void DeleteSite()     //方法要符合委托的类型
            {
            // impelement  执行删除站点的操作代码
            }
    }
     

    SiteManger类的方法要符合委托类型,这样他的方法可以很方便的当作事件的方法使用。
    五. 触发事件
    当调用事件时就可以说时触发了事件。事件是从定义它的类中触发的
    示例

    using system;

    public class  menu          //定义一个菜单类
    {
            
    public menu(strng title)  //类的构造函数
            {
                   
    //初始化变量
            }
            public void Run()    //触发事件的过程
            {
            //声明一个菜单项目对象(menuItem前面已经定义)
            menuItem  myMenuItem=new menuItem   }
            myMenuItem.fire 
    //调用fire 方法触发事件,事件执行SiteManger类的方法
            }
    }
     

    到此为止我就完成了整个事件的实现过程。

    六.为事件增加“添加/删除”方法
     如果由大量的方法需要注册到事件时,可以为为事件增加 Add,Remove 方法。通过访问事件的“添加/删除方法”来注册方法
    示例:

    using sytem;

    pulic Delete ovid MenuHandler(
    object sender,EventArgs e); //示例1的变形
    public class MenuItem
    {
       
    int numberof Events;
        string tex;
        private  MenuHandler mh=null;  //内部得一个委托
        public event MenuHandler MenuSelecton
        {
            add                
    //增加“添加”方法
            {
            mh
    +=value;
            nuberofevents
    ++;
            }
            remove
            {
            mh
    -=value;
            numberofevents
    --;
            }
        }
    }
                                                                            轉自:http://www.cnblogs.com/cngis/articles/14421.html
  • 相关阅读:
    javascript:void(0) 真正含义
    Memcache and Mongodb
    window下redis nosql初试
    CAS单点登录配置
    代理模式-你不并知道我的存在
    Netty In Action中文版
    【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)
    同步并发操作之等待一次性事件
    关于Java特种兵下冊
    自己定义UISlider的样式和滑块
  • 原文地址:https://www.cnblogs.com/scottckt/p/803877.html
Copyright © 2011-2022 走看看