备忘,Sl中委托使用两种方法

这些日子使用委托的时候很不顺,于是认真的看了几篇文章,然后写了个小demo,于是效果就出来了。

delegate可以多播,有两种方法实现

1、使用同一对象,接收消息

代码:

TestA 类中的委托

public class TestA
    {
        //定义委托 计算点到直线的距离
        public delegate void SendMessageAEventHandler(object sender, object obj);
        //定义事件
        public event SendMessageAEventHandler SendMessageEventA;

        public TestA() { 
            this.SendMessageEventA +=new SendMessageAEventHandler(TestA_SendMessageEventA);
        }

        void TestA_SendMessageEventA(object sender, object obj) {
            MessageBox.Show("A TestA  " + obj.ToString());
        }

        public void SendMessageATest(string msg) {

            SendMessageAEventHandler handle = SendMessageEventA;

            if (handle != null) {
                handle(this, msg);
            }
        }
    }

在MainPage中使用

 void MainPage_Loaded(Object sender, RoutedEventArgs e) {
             ta = new TestA();
            ta.SendMessageEventA +=new TestA.SendMessageAEventHandler(ta_SendMessageEventA);
        }
//接收
void ta_SendMessageEventA(object sender, object obj) {
            MessageBox.Show("A MainPageTestA  "+obj.ToString());
        }
//发送
 private void button2_Click(object sender, RoutedEventArgs e)
        {
            ta.SendMessageATest(this.textBox2.Text);
        }

在Test中接收

public Test(MainPage mainPage,TestA t) { 
           mainPage.SendMessageEvent +=new MainPage.SendMessageEventHandler(mainPage_SendMessageEvent);
           
            t.SendMessageEventA +=new TestA.SendMessageAEventHandler(ta_SendMessageEventA);
            TestB.SendMessageEventB+=new TestB.SendMessageBEventHandler(TestB_SendMessageEventB);
        }

void ta_SendMessageEventA(object sender, object obj) {
            MessageBox.Show("A TestA " + obj.ToString());
        }

结论表示,通过按钮事件发送一个消息,MainPage 和Test 中都可以接收

2、使用静态的事件定义接收

TestB中定义静态的委托事件

public class TestB
    {
         //定义委托 计算点到直线的距离
        public  delegate void SendMessageBEventHandler(object sender, object obj);
        //定义事件
        public static event SendMessageBEventHandler SendMessageEventB;

        public static void SendMessageBTest(string msg) {

            SendMessageBEventHandler handle = SendMessageEventB;

            if (handle != null) {
                handle("Obj", msg);
            }
        }
    }

MainPage中使用

 void MainPage_Loaded(Object sender, RoutedEventArgs e) {
            TestB.SendMessageEventB+=new TestB.SendMessageBEventHandler(TestB_SendMessageEventB);           
        }
//MainPage中接收
 void TestB_SendMessageEventB(object sender, object obj) {
            MessageBox.Show("B MainPageTestB  " + obj.ToString());
        }
//发送
private void button3_Click(object sender, RoutedEventArgs e)
        {
            TestB.SendMessageBTest(this.textBox3.Text);
        }

Test中接收

public Test(MainPage mainPage,TestA t) { 
            TestB.SendMessageEventB+=new TestB.SendMessageBEventHandler(TestB_SendMessageEventB);
        }

 void TestB_SendMessageEventB(object sender, object obj) {
            MessageBox.Show("B TestB " + obj.ToString());
        }

实验表示,使用静态的委托也能接收到多播消息

额,不懂如何上传源码Demo~~知道的告知下,嘿嘿 谢谢~

posted on 2011-01-05 22:09  陆晓峰  阅读(3747)  评论(3编辑  收藏  举报

导航