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)就相当于触发了委托里面所有定义的回调函数。
感觉自己又写了一篇水贴