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)

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

首先,我会认真考虑您的设计。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。因此,公共方法将是可行的。