2

在 C# 应用程序中的多个窗口之间进行交互的最佳/正确方式是什么?最近,我遇到了一个问题,其中一个程序窗口必须调用修改主窗口的方法。我的解决方案是创建类似工厂的类,它将安排所有底层模型数据并组织各种窗口之间的通信(通过委托)。但是,由于传递一两个代表不是问题,我开始思考如果我的其他窗口需要 10 个代表才能与主窗口正确交互怎么办?代表是好的解决方案吗?如何以良好的方式传递它们 - 通过构造函数、属性?或者也许需要使用这么多代表本身就是一些严重的设计缺陷?

4

5 回答 5

3

您需要通过控制器将模型从视图中拆分出来。放置一个能够同时具有表单引用并能够管理共享信息的对象。

另一种解决方案是将 formX 的引用发送给 formY,这样他们就可以进行通信了。

于 2008-11-12T13:42:42.773 回答
1

我们使用使用主题/观察者模式的自定义构建表单管理器。

每个打开的表单都会报告给 FormsManager,FromsManager 使自己成为表单的观察者。

它还使表单成为 FormsManager 的观察者。

因此,您最终会得到每个表单都观察 FormsManager 和 FormsManager 观察每个表单。然后,每个表单都可以通过 FormsManager 与任何其他表单进行通信,而无需每个表单都知道所有其他表单。

于 2008-11-12T14:00:04.720 回答
0

如果只需要和主窗口交互,为什么不在别人的构造函数中引用主窗口呢?

public class MainForm : Form
{
}

public class OtherForm : Form
{
    protected MainForm MainForm { get; set; }

    public OtherForm(MainForm mainForm) : base()
    {
        this.MainForm = mainForm;
    }
}

编辑:

简单有效。

如果您的表单需要与应用程序的所有其他表单交互,那么服务定位器类型模式可能更适合。

于 2008-11-12T13:34:27.283 回答
0

以前使用 MFC,有一些东西可以通知所有窗口。您将传递一个带有参数的事件 id。

您可以对一个委托执行类似的操作,该委托将公开一个事件 ID 和一组参数。

这样做最大的好处是windows只需要实现一个网关。

于 2008-11-12T13:34:52.837 回答
0

您可以使用单个委托,使用自定义 EventArgs 传递多个信息,例如:通知类型、附加参数等。

于 2008-11-12T13:39:26.323 回答