windows窗体中的双向通信-从父级到子级的回调
本文关键字:回调 窗体 双向通信 windows | 更新日期: 2023-09-27 18:19:56
我有两种形式。Form1和Form2
表格2中有以下代码。
/// Delegate used for Reset
public delegate void ResetEventHandler(object sender, ResetPathProfileEventArgs e);
public event ResetEventHandler ResetPathProfileEvent;
protected virtual void RaiseResetEvent(string status)
{
// Raise event if something is listening
if (ResetPathProfileEvent != null)
{
var args = new ResetPathProfileEventArgs { Status = status };
ResetPathProfileEvent(this, args);
}
}
现在在表格1中,我写了以下代码
var frm = new Form2();
frm.ResetPathProfileEvent += frm_ResetPathProfileEvent;
frm.ShowDialog();
void frm_ResetPathProfileEvent(object sender, ResetPathProfileEventArgs e)
{
MessageBox.Show(e.Status);
}
到那时,我可以根据表单2上的用户操作,成功地在表单1代码中引发事件。
类似地,我想在form2中添加所需的代码,以便form1可以在完成form1上的预期用户交互后通知form2。
我正在尝试探索各种方法来做到这一点。
a) 我可以在form2上公开一个公共方法,并允许form1调用它。b) 在引用form2 中的公共方法的form1上定义委托和事件
我感兴趣的是在form2上定义委托和事件,并从from1实现此回调功能。
有什么提示吗????+++++++++++++++++++++++++++++++++
现在让我写下我是如何实现的
我在同一个命名空间中定义了一个新的委托,它同时包含form1和form2
/// Delegate used for Redraw
public delegate void RedrawEventHandler(RedrawPathProfileEventArgs e);
我已经为这个委托声明了一个引用变量
public RedrawEventHandler RedrawEvent;
在form1中为该事件注册,指向form2回调函数
var frm = new Form2();
frm.ResetPathProfileEvent += frm_ResetPathProfileEvent;
this.RedrawEvent += new RedrawEventHandler(frm.RedrawCallBackFn);
frm.Show();
根据需要调用从形式1到形式2的事件
var args = new RedrawPathProfileEventArgs();
args.FileName = "xyz";
RedrawEvent(args);
我知道,这是可以做到这一点的众多选择之一。但我需要这样做,因为form1是一个第三方供应商的应用程序,我正在为它开发一个插件
我想确保这两个之间的紧密耦合,并为form1开发人员提供非常少的工作来集成我的表单(form2)
首先,我会认真考虑您的设计。Form1拥有Form2,但他们都将对彼此的事件做出回应;你有双向耦合,你把Form2作为一个对话框。嗯。不管怎样:
您的不同通信选项有:
1) 事件,form1公开事件form2公开事件,它们都订阅了其他事件。
2) 事件参数。如果表单1希望在"frm_ResetPathProfileEvent"中向表单2提供反馈,则表单2可以向ResetPathProfile EventArgs添加内容,这些内容可以由表单1操作,并在引发事件后进行检查。
3) 方法,因为form1拥有form2,所以它可以调用公共方法来触发行为
4) 事件聚合器模式(集线器和轮辐模型),订阅者和发布者的解耦(示例impl:http://compositewpf.codeplex.com/SourceControl/latest#V4/PrismLibrary/Desktop/Prism/Events/EventAggregator.cs)
委托(和事件)专门用于允许多个订阅者侦听一个事件。例如,您可以有四个窗体来侦听事件,并通知所有窗体。在您的情况下,您只有一种形式在侦听,但使用事件的选择仍然是正确的。
然而,反过来说,这听起来不符合逻辑,公共方法可能是更好的选择。你可以这样看。Form2并不关心它将事件发送给谁。只是发生了一些事件,任何关心的人都可以听(或不听)。另一方面,Form1非常关心谁会收到活动。它知道Form2需要接收事件,并希望将其专门发送给Form2。因此,公共方法将是可行的。