【问题标题】:Setting One Windows Form as the MDI Child of Another Windows Form ( Or Something Equivalent)将一个 Windows 窗体设置为另一个 Windows 窗体的 MDI 子窗体(或等效项)
【发布时间】:2011-04-20 07:25:25
【问题描述】:

我有两个窗体应用程序,我们称它们为FormA.exe(父)和FormB.exe(子)。 FormB.exe 是一个可以单独运行的应用程序。 FormA.exe 是另一个应用程序,其功能之一是调用FormB.exe

我有这两个应用程序的源代码,我可以修改它们。

目前每当FormA.exe想要调用FormB.exe,我都会使用Process类来启动FormB.exe进程。问题是

  1. 我不知道如何在这两个Forms 之间传递消息。
  2. FormB.exeFormA 调用时,它会在用户面前显示为另一个 应用程序,独立于FormA.exe,但我希望它显示为@987654334 下的单个应用程序@,FormB 作为 MDI 子级。
  3. FormB 本身就是一个 MDI。因此,如果我将其作为 MDI 加载,我将收到此错误 System.ArgumentException: Form cannot be both an MDI child and MDI parent
  4. 如果我不加载为 MDI,那么我的 FormB 将无法正常工作。换句话说,FormA 的全部目的都丢失了。

除了将FormB 设置为FormA 的MDI 孩子之外,还有其他方法可以使一个winform 应用程序完全包含在另一个应用程序中,并使它们相互通信吗?

【问题讨论】:

  • 更好的方法是把两个表单放在同一个进程中,因为你有代码
  • @David,这是一项巨大的工作量。
  • 也许工作量很大,但至少有成功的希望

标签: c# winforms


【解决方案1】:

我同意诺尔的观点

有很多方法可以实现您正在尝试的目标。一种方法是使用System.Reflection

在formA中这样

 Assembly a = Assembly.LoadFrom("WindowsApplication1.exe");
        Form frm = a.CreateInstance("WindowsApplication1.FormB") as Form;
        frm.MdiParent = this;
        frm.Show();

【讨论】:

  • @Subhash,但是你将如何在FormAFormB 之间传递消息?
  • @Conditional Change 再次有几种方法,但我方便的方法是实现 Interface Like IMdiParent formA=this.parent as IMdiParent and IChild formB=frm as IChild
  • @Subhash,嗯,您的代码不起作用,因为 FormB 本身是 MDI 表单,请参阅更新的问题。
  • @Conditional Change 您可以随时在运行时更改“IsMdiContainer”属性
  • @Subhash,我已经测试过了;如果我在运行时更改了IsMdiContainer,那么FormB 将成为非MDI,这将影响它的功能。
【解决方案2】:

您可以将 FormA.exe 中的项目引用添加到 FormB.exe 并以编程方式将 formb 作为 mdi 子项加载到 forma。

然后,您可以轻松地在它们之间传递消息。 FormB.exe 仍然可以作为应用程序单独调用,只需将其保留为 windows 应用程序而不是 windows 库项目即可。

【讨论】:

  • @Noel,你能再明确一点吗?你是说我可以用System.Reflection.Assembly.LoadFrom?以及如何在两个应用程序之间传递消息?
  • 如果有源代码就不需要使用反射了。您可以打开 FormA 项目的 VS 解决方案,并添加对 FormB 的项目引用。然后,您可以在 FormA 中编写代码,将 FormB 视为解决方案中的任何其他项目。
  • 要传递消息,你只需调用FormB中类的方法,没有什么神奇的,它只是被视为另一个dll。
  • 如果您正在寻找一些在智能客户端内部进行通信的模式,请使用 Google 事件聚合器模式。有多种框架包含您可以使用的实现,例如 Prism、CAB、caliburn。
  • @Noel,我忘了说FormB是MDI形式,所以好像不行;查看问题更新。
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多