前言
WinForm中的MDI(Multiple Document Interface)模式允许设计能容纳多个子窗口的父窗口应用程序。通过设置窗体属性和编写特定代码,在Visual Studio环境里可以创建MDI父窗体和子窗体,并实现它们的打开、关闭和切换等功能。 WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug。
1. MDI模式介绍
多文档界面(MDI)是Windows应用程序中的一种用户界面设计模式,允许在一个父窗体内部打开和管理多个子窗体。这种模式特别适合需要同时查看和操作多个文档的软件,比如文本编辑器、绘图程序和报表查看器等。
在C#中,通过继承 Form 类并设置其 IsMdiContainer 属性为 true 来创建MDI父窗体。对于MDI子窗体,需要将它们的 MdiParent 属性设置为父窗体实例。设置好以后,可以在父窗体内以编程方式打开多个子窗体,实现MDI应用程序的基本结构。
2. 创建MDI父窗体
在Visual Studio中,可以通过添加 Form 控件并设置其 MDIChildren 属性为 true 来创建MDI父窗体。this.IsMdiContainer = true
3. 创建MDI子窗体
核心属性:
MdiParent :指定MDI子窗体的父窗体,它是实现多文档界面的必要条件。
Text :定义子窗体的标题,通常用于显示文档名称或状态。
IsMdiChild :一个布尔属性,用于标识窗体是否为MDI子窗体。
ActiveMdiChild :返回当前活动的MDI子窗体,这是管理活动窗体的便捷方式。
核心方法:
Activate() :激活窗体,使其成为活动窗体。
接下来的将进一步探讨如何在MDI父窗体中加载子窗体,管理子窗体实例,以及如何在MDI应用程序中切换和排列子窗体。
创建一个上面的窗体,然后把IsMdiContainer设置为True,作为父窗体;
public frm_Main(){ InitializeComponent(); this.Text = Application.ProductName; this.Top = 0; this.Left = 0; this.Width = Screen.PrimaryScreen.WorkingArea.Width; this.Height = Screen.PrimaryScreen.WorkingArea.Height; this.device_corp.Text = "XXXX集团液冷板设备";}
下面开始创建子窗体,五个子窗体,
public Form_Inouts mFormInouts;public Form_Running mFormRunning;public Form_Config mFormConfig;public Form_Manual mFormManual;public Form_User mFormUser;
下面看一下用代码怎么调用实现的;
public partial class frm_Main : Form{
public Form_Inouts mFormInouts; public Form_Running mFormRunning; public Form_Config mFormConfig; public Form_Manual mFormManual; public Form_User mFormUser; public frm_Main() { InitializeComponent(); this.Text = Application.ProductName; this.Top = 0; this.Left = 0; this.Width = Screen.PrimaryScreen.WorkingArea.Width; this.Height = Screen.PrimaryScreen.WorkingArea.Height; this.device_corp.Text = "XXXX集团液冷板设备"; }private Form LoadMdiChild(Type formclass){ Form nForm = null; foreach (Form frm in this.MdiChildren) { if (frm.GetType() == formclass) { nForm = frm; break; } } if (nForm == null) { nForm = (Form)(Activator.CreateInstance(formclass)); nForm.MdiParent = this; nForm.Left = 0; nForm.Top = 0; nForm.Dock = System.Windows.Forms.DockStyle.Fill; nForm.FormBorderStyle = FormBorderStyle.None; nForm.MaximizeBox = false; nForm.MinimizeBox = false; nForm.ControlBox = false; } return nForm;}
private void ShowMdiChild(Form formobject){ if (this.ActiveMdiChild == formobject) return; if (DoCheckActiveForm()) { formobject.Show(); formobject.MdiParent = this; formobject.BringToFront(); formobject.Activate(); }}public bool DoCheckActiveForm(){ return true;} private void button_Home_Click(object sender, EventArgs e) { if (mFormRunning == null) mFormRunning = (Form_Running)LoadMdiChild(typeof(Form_Running)); ShowMdiChild(mFormRunning); label_Caption.Text = "操作页面"; }
private void button_manual_Click(object sender, EventArgs e) { if (mFormManual == null) mFormManual = (Form_Manual)LoadMdiChild(typeof(Form_Manual)); ShowMdiChild(mFormManual); label_Caption.Text = "手动页面"; }
private void button_config_Click(object sender, EventArgs e) { if (mFormConfig == null) mFormConfig = (Form_Config)LoadMdiChild(typeof(Form_Config)); ShowMdiChild(mFormConfig); label_Caption.Text = "参数设置"; }
private void button_inout_Click(object sender, EventArgs e) { if (mFormInouts == null) mFormInouts = (Form_Inouts)LoadMdiChild(typeof(Form_Inouts)); ShowMdiChild(mFormInouts); label_Caption.Text = "输入输出页面"; }
private void button_close_Click(object sender, EventArgs e) { this.Close(); }
private void button_about_Click(object sender, EventArgs e) { Form FAbout = new AboutBox1(); FAbout.ShowDialog(); }
private void frm_Main_Load(object sender, EventArgs e) { if (mFormRunning == null) mFormRunning = (Form_Running)LoadMdiChild(typeof(Form_Running)); ShowMdiChild(mFormRunning); label_Caption.Text = "操作页面"; }} }
总结:
WinForm MDI 模式就像是窗体管理大师,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用,减少了视野中的混乱,在这个统一的界面里,用户就能轻松上手,享受程序带来的便利,各个小窗体还有机会共享主窗体的资源,真是功能强大。
阅读原文:原文链接
该文章在 2026/1/4 10:29:20 编辑过