我有2个表格。 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);
}
}
现在在form1中,我编写了以下代码
var frm = new Form2();
frm.ResetPathProfileEvent += frm_ResetPathProfileEvent;
frm.ShowDialog();
void frm_ResetPathProfileEvent(object sender, ResetPathProfileEventArgs e)
{
MessageBox.Show(e.Status);
}
我可以根据form2上的用户操作在form1代码中成功引发事件。
同样,我想在form2中添加所需的代码,以便form1可以在完成对form1的预期用户交互时通知form2。
我正在尝试探索各种方法。
a)我可以在form2上公开一个公共方法,并允许form1调用它。 b)在form1上定义一个委托和一个事件,引用form2中的公共方法
我感兴趣的是在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();
根据需要从form1调用事件到form2
var args = new RedrawPathProfileEventArgs();
args.FileName = "xyz";
RedrawEvent(args);
我知道这是可用于此的众多选项之一。但我需要这样做,因为form1是第三方供应商应用程序,我正在开发一个插件
我想确保这两者之间的紧密耦合,并且为form1开发人员提供非常小的工作来集成我的表单(form2)
答案 0 :(得分:0)
代表(和事件)专门用于允许多个订阅者收听事件。你可以,例如有四种形式可以收听事件,所有这些形式都会得到通知。在您的情况下,您只有一个正在倾听的表单,但使用事件的选择仍然是正确的。
然而,反过来说,这听起来不合逻辑,公共方法可能是更好的选择。你可以这样看待它。 Form2并不关心它将事件发送给谁。只有一些事件已经发生,任何关心的人都可以听(或不)。另一方面,Form1非常关心谁接收了这个事件。它知道Form2需要接收事件,并希望将其专门发送给Form2。因此,公共方法将是可行的方法。
答案 1 :(得分:0)
首先,我会认真重新考虑你的设计。 Form1拥有Form2,但他们都会回应彼此的事件;你有双向耦合,你将Form2作为对话框。 Hmm..anyways:
您的不同沟通方式是:
1)事件,form1公开事件form2公开事件,他们都订阅彼此的事件。
2)事件参数。如果表单1想要在“frm_ResetPathProfileEvent”中向form2提供反馈,则form2可以向ResetPathProfileEventArgs添加内容,这些内容可以由form1操纵并在事件引发后进行检查。
3)方法,因为form1拥有form2,它可以调用公共方法来触发行为
4)事件聚合器模式(中心和辐条模型),订阅者和发布者的分离(示例impl:http://compositewpf.codeplex.com/SourceControl/latest#V4/PrismLibrary/Desktop/Prism/Events/EventAggregator.cs)