在winform中嵌入winform(c#)

在winform中嵌入winform(c#),c#,winforms,C#,Winforms,是否可以在另一个windows窗体中嵌入windows窗体 我已经在VisualStudio中创建了一个windows窗体及其所有相关行为 现在,我想创建另一个包含选项卡视图的windows窗体,并将第一个windows窗体嵌入到选项卡视图中。这可能吗?不是直接的。您可以创建一个usercontrol,将所有代码从表单移动到usercontrol,并在两种表单中使用它。您可能需要更改表单中的一些代码,但可能不会太多。您可以尝试SetParent()API调用,尽管我自己还没有验证它是否可以工作。

是否可以在另一个windows窗体中嵌入windows窗体

我已经在VisualStudio中创建了一个windows窗体及其所有相关行为


现在,我想创建另一个包含选项卡视图的windows窗体,并将第一个windows窗体嵌入到选项卡视图中。这可能吗?

不是直接的。您可以创建一个usercontrol,将所有代码从表单移动到usercontrol,并在两种表单中使用它。您可能需要更改表单中的一些代码,但可能不会太多。

您可以尝试SetParent()API调用,尽管我自己还没有验证它是否可以工作。如果这不起作用,那么上面的Mendlet解决方案可能是您的最佳选择。

实现这一点的方法是使用用户控件,而不是表单。这就是用户控件的用途。这种技术可以用于很多用户界面技巧,例如向导(控件可以在向导和应用程序的其他部分之间共享)、带有树控件的浏览器样式浏览器以及基于选定节点交换的控件

我在应用程序体系结构方面做了很多工作,这些应用程序体系结构使用用户控件来处理所有事情,并使用用于探索者、向导和其他类型表单的框架(甚至可以回到VB6)。作为一种方法,它非常有效。

免责声明 这将工作,因为我在我的应用程序中广泛使用它。这就是说,我会根据嵌入的东西开始剥落的程度来执行用户控制路线。供参考


是的,这是可能的。这就是为什么:

public static void ShowFormInContainerControl(Control ctl, Form frm)
{
    frm.TopLevel = false;
    frm.FormBorderStyle = FormBorderStyle.None;
    frm.Dock = DockStyle.Fill;
    frm.Visible = true;
    ctl.Controls.Add(frm);
}
我把它放在类库中,然后从我想要嵌入的表单中这样称呼它

public FrmCaseNotes FrmCaseNotes;
FrmCaseNotes = new FrmCaseNotes();
WinFormCustomHandling.ShowFormInContainerControl(tpgCaseNotes, FrmCaseNotes);
其中
tpgCaseNotes
是我希望表单
FrmCaseNotes
嵌入的控件。

在本例中,我调用的表单上有一个选项卡页。

假设您有两个项目win1和win2。两者都是winform项目。 您希望在win1中嵌入win2

解决方案:

打开win2项目并将输出类型更改为“类库”(在“应用程序”选项卡中)

打开项目win1,并将win2 dll项目作为引用添加到win1项目中 进入win1代码,并输入以下内容:

        win2.Form1 formI = new win2.Form1();
        formI.TopLevel = false;
        formI.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        formI.Size = this.Size;
        formI.BringToFront();
        formI.Visible = true;
        this.Controls.Add(formI);

用法:EmbedForm.SetParent(ChildForm.Handle,ParentForm.Handle)

+1将所有通用性重构到一个用户控件中,您可以共享。对于错误的信息,我会-1,因为直接将一个表单嵌入到另一个表单中是绝对可能的,他会问“有可能吗…”但我从经验中学到,这是一个糟糕的想法/噩梦,如果人们认为这是不可能的,那就最好…;-)作为一名C#新手,我尝试了这一方法,折射圣骑士也尝试了下面的方法。用户控制方法允许表单设计者在设计时查看嵌入的表单,而直接从中嵌入表单(如下所示)则不需要,需要一些视觉效果。显然,如果应用程序已经编写了表单,我会采用折射圣骑士的方法,但对于新的工作,我会采用这种解决方案。
using System.Runtime.InteropServices;
class EmbedForm{
    [DllImport("user32.dll")]
    public extern IntPtr SetParent(IntPtr hWndChild, hWndNewParent);
    //code, code, code...
}