wpf 两个窗体之间的事件响应。

     今天开发wpf窗体程序,遇到一个问题,在用户管理模块中,有个listBox显示所有的用户,旁边有个按钮(添加用户)。当点击添加用户的时候弹出新的窗体,完成相关操作,想要实现的功能是添加完成之后,第一个窗体能相应事件,完成刷新功能。同时因为数据的读取方法在父窗体中,子窗体不调用。想到用事件的方式实现,具体的实现过程如下。

    父窗体, UserMangaerForm。具有如下的函数:

    BindingData()  完成数据的刷新功能。

    AddBtn_click(object sender, RoutedEventArgs e)  相应点击 添加用户按钮。  里面的方法如下:

     private void addBtn_Click(object sender, RoutedEventArgs e)
        {
            AddUserForm a = new AddUserForm();
            a.Show();            
        }

    要完成该功能,就需要给子窗体增加事件。而父窗体相当于Listener的角色。

    首先进行子窗体的修改。

    首先声明一个事件的委托

    public delegate void PassResultHandler(object sender, int result);   触发源和参数,因为我们想将子窗体的一个处理结果传回去,那么就简单的用int result作为参数

    这个地方可以定义自定义的参数类型。

    添加一个事件,这是一个委托型的变量

    public event PassResultHandler pevent;

    在需要的地方触发该事件

    pevent(this,result);

    子窗体的功能完成

 

    在父窗体中我们要完成对该类事件的监听。

    于是修改原来的click函数,使之变为

   private void addBtn_Click(object sender, RoutedEventArgs e)
        {
            AddUserForm a = new AddUserForm();

    //为子窗口增添一个事件
            a.pevent += new AddUserForm.PassResultHandler(PassResult);
            a.Show();            
        }

 

    这样我们需要一个与委托 passResultHandler具有相同签名的方法

 

   private void PassResult(object sender, int e)
        {
            if (e == 1)
                BindingData();
        }

   在这个方法里面完成相应的刷新方法。

   

    对上面的一些思考

    委托相当于函数的指针,这里,我们用new AddUserForm.passResultHandler(PassResult);方法相当于将PassResult这个函数的指针传递到了AddUserForm中。对委托进行实例化的时候需要提供一个引用函数,并将其作为构造函数的参数。这样,当我们调用a.pevent的时候,PassResult也将被调用。如果有多个与委托相同的签名的函数,这些函数也将被依次调用。

  

    这样事件是委托类型的变量,而委托里面的实例函数相当于指针,或者称为回调函数。事件触发pevent(this,result)就相当于触发了委托里面所有定义的回调函数。

   

    感觉自己又写了一篇水贴

posted @ 2012-03-16 09:51  庸蛹  阅读(2828)  评论(2编辑  收藏  举报