是否可以将一个 Windows 窗体嵌入到另一个 Windows 窗体中?
我在 Visual Studio 中创建了一个 Windows 窗体以及它的所有相关行为。
现在,我想创建另一个包含选项卡视图的 Windows 窗体,并将第一个窗体嵌入到选项卡视图中。这可行吗?
这种方法在我的应用程序中得到了广泛的使用,因此它可以工作。但是,要注意,如果您将嵌入深入进行,最好采用用户控件的方式,以避免出现问题。请注意。
是的,这是可能的。以下是实现方法:
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);
我希望在嵌入在表单FrmCaseNotes
中的控件tpgCaseNotes
上进行操作。
在这种情况下,该控件是来自我所调用的表单上的选项卡页。
不能直接这样做。您可以创建一个用户控件,将表单中的所有代码移动到该用户控件中,并在两个表单中使用它。您可能需要更改一些来自表单的代码,但可能不需要太多。
假设您有两个Winform项目:win1和win2。您想要将win2嵌入到win1中。
解决方案:
打开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);
using System.Runtime.InteropServices;
class EmbedForm{
[DllImport("user32.dll")]
public extern IntPtr SetParent(IntPtr hWndChild, hWndNewParent);
//code, code, code...
}
用法:EmbedForm.SetParent(ChildForm.Handle, ParentForm.Handle)