幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

自定义事件的标准定义步骤为:

1,定义委托
2,定义事件发布者类
    声明事件
    定义事件参数类
    定义事件的On方法(直接执行事件)
    定义触发事件的方法(包括触发条件,当达到条件时调用On方法)
3,定义事件订阅者类(可以有多个订阅者类)
    定义事件处理程序方法
4,注册事件
    实例化发布者和订阅者
    在发布者事件上绑定一个已实例化的以事件处理程序方法为参数委托,完成事件注册
5,使用事件
    执行发布者中触发事件的方法,触发事件.

具体实例如下:*******************************************************************************************

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

namespace Delegate_Event
{

    // 定义事件发布者类
    public class Publisher
    {
        private int count;
        public string name = "发布者";

        // 定义委托
        public delegate void NumberChangedEventHandler(Object sender, SomeEventArgs e);

        public event NumberChangedEventHandler NumberChanged; // 声明事件

        // 定义SomeEventArgs类,传递给订阅者所感兴趣的信息,这是一个类中类
        public class SomeEventArgs : EventArgs
        {
            public readonly int count;
            public SomeEventArgs(int count)
            {
                this.count = count;
            }
        }

        //定义调用事件的OnXXX方法,以供其它触发方法调用
        protected virtual void OnNumberChanged(SomeEventArgs e)
        {
            if (NumberChanged != null)
            { // 触发事件
                NumberChanged(this, e);
            }
        }

        //定义触发事件的方法
        public void DoSomeThing()
    {
        for (int i = 0; i < 15; i++)
        {
            count++;
            if (count >= 10)//触发条件
            {
                SomeEventArgs e = new SomeEventArgs(count);
                OnNumberChanged(e);//调用方法,以引发事件
            }
        }
    }
    }

    // 定义事件订阅者
    public class Subscriber
    {
        //事件处理程序
        public void OnNumberChanged(Object sender,Publisher.SomeEventArgs e) //注意这个方法名和发布者里的同名方法,它们参数不同,作用也不用.
        {
            Publisher publisher = (Publisher)sender;
            Console.WriteLine("Subscriber notified: {0},count = {1}", publisher.name, e.count);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub = new Subscriber();
            pub.NumberChanged += new Publisher.NumberChangedEventHandler(sub.OnNumberChanged);
            pub.DoSomeThing(); // 应该通过 DoSomeThing() 来触发事件
            Console.ReadKey();
        }
    }
}

posted on 2009-02-27 14:07  Lucker  阅读(687)  评论(0编辑  收藏  举报