C# 将一个Windows窗体设置为另一个Windows窗体(或其他等效窗体)的MDI子级

C# 将一个Windows窗体设置为另一个Windows窗体(或其他等效窗体)的MDI子级,c#,winforms,C#,Winforms,我有两个windows窗体应用程序,让我们称它们为FormA.exe(父级)和FormB.exe(子级)FormB.exe是一个可以单独运行的应用程序FormA.exe是另一个应用程序,其功能之一是调用FormB.exe 我有两个应用程序的源代码,我可以修改它们 当前每当FormA.exe想要调用FormB.exe,我都会使用Process类来启动FormB.exe进程。问题是 我不知道如何在这两个表单之间传递消息 当从FormA调用FormB.exe时,它将作为另一个应用程序出现在用户面前,独

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

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

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

  • 我不知道如何在这两个
    表单之间传递消息
  • 当从
    FormA
    调用
    FormB.exe
    时,它将作为另一个应用程序出现在用户面前,独立于
    FormA.exe
    ,但我希望它作为单个应用程序出现在
    FormA
    下,并将
    FormB
    作为MDI子项
  • FormB
    本身就是一个MDI。因此,如果将其作为MDI加载,则会出现以下错误
    System.ArgumentException:表单不能既是MDI子级又是MDI父级
  • 如果我没有作为MDI加载,那么我的
    FormB
    就无法正常工作。换言之,
    FormA
    的全部目的都丧失了

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

    您可以将项目引用从FormA.exe添加到FormB.exe,并以编程方式将FormB作为MDI子项加载到FormA中

    你可以很容易地在他们之间传递信息。FormB.exe仍然可以作为应用程序单独调用,只需将其作为windows应用程序而不是windows库项目使用。

    我同意Noel的观点

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

    像这样的形式

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

    @诺尔,你能说得更清楚些吗?你是说我可以用吗?我如何在两个应用程序之间传递消息?如果你有源代码,你不需要使用反射。您可以为FormA项目打开VS解决方案,并向FormB添加项目引用。然后,您可以用FormA编写代码,将FormB视为解决方案中的任何其他项目。要传递消息,您只需调用FormB中的类的方法,没有什么神奇的事情发生,它只是被视为另一个dll。如果您正在智能客户端内寻找一些通信模式,请使用google事件聚合器模式。有各种各样的框架包含您可以使用的实现,例如Prism、CAB、caliburn。@Noel,我忘了提到
    FormB
    是MDI表单,所以它似乎不起作用;请参阅问题更新。@Subhash,但是如何在
    FormA
    FormB
    之间传递消息?@条件更改还有几种方法,但我方便的方法是实现接口,如
    IMdiParent FormA=this.parent as IMdiParent
    IChild FormB=frm as IChild
    @Subhash,嗯,您的代码无法工作,因为
    FormB
    本身是一个MDI表单,请参阅问题更新。@条件更改您可以在运行时随时更改“IsMdiContainer”属性time@Subhash,我已经测试过了;如果我在运行时更改了
    IsMdiContainer
    ,那么
    FormB
    将成为非MDI,这将影响它的功能。更好的方法是将两个表单放在同一个过程中,因为您有code@David,这是一个巨大的工作量。也许是很多工作,但至少有成功的希望