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