Windows窗体中的双向通信 - 从父级到子级的回调

时间:2013-06-25 04:14:49

标签: c# events delegates

我有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)

2 个答案:

答案 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