C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤

C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤

前言

嗨,各位码农们!今天我们要来聊聊如何在 C# 的 WinForms 应用程序中用 MDI(Multiple Document Interface)模式来优雅地管理多个子窗体。

如果你曾经对着一堆乱七八糟的窗体不知所措,或者想要让你的应用程序看起来更专业一点,那么这篇文章就是为你准备的!

想象一下,当你打开一个应用,所有的子窗体都乖乖地呆在一个主窗口里面,是不是感觉棒极了?好了,废话不多说,让我们开始吧!

Step By Step 步骤

创建一个 WinForm 类型的项目

添加三个 Windows 窗体

FrmMain.cs(主窗体)

FrmTest1.cs(这俩是小弟,也就是子窗体)

FrmTest2.cs

打开 FrmMain 窗体设计器,修改以下属性

Text: MDI 主窗体

Size: 1000,600

StartPosition: CenterScreen

IsMdiContainer: True(重要,将窗体设置为 MDI 容器)

其它属性默认值即可

拖拽一个 MenuStrip 控件到 FrmMain 窗体设计器里,并将 MenuStrip 控件改名为 MenuFuns

在 FrmMain 窗体设计器里输入两个菜单项:

打开窗体1,同时将菜单项改名为 menuOpenWin1

打开窗体2,同时将菜单项改名为 menuOpenWin2

分别双击这两个菜单项,自动生成菜单项的单击事件,如:

private void menuOpenWin1_Click(object sender, EventArgs e)

{

}

private void menuOpenWin2_Click(object sender, EventArgs e)

{

}

在这两个事件里写上打开相应子窗体的代码,最终代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace MRHelper

{

public partial class FrmMain : Form

{

public FrmMain()

{

InitializeComponent();

}

private void menuOpenWin1_Click(object sender, EventArgs e)

{

var frm = new FrmTest1(); // 实例化子窗体

frm.MdiParent = this; // 让子窗体知道它的老大是谁

frm.MinimizeBox = false; // 不要最小化按钮

frm.MaximizeBox = false; // 也不要最大化按钮

frm.StartPosition = FormStartPosition.CenterScreen; // 居中显示

frm.Show(); // 显示子窗体

}

private void menuOpenWin2_Click(object sender, EventArgs e)

{

var frm = new FrmTest2();

frm.MdiParent = this;

frm.MinimizeBox = false;

frm.MaximizeBox = false;

frm.StartPosition = FormStartPosition.CenterScreen;

frm.Show();

}

}

}

打开 Program.cs 文件,设置启动窗体为 FrmMain 窗体,如:

Application.Run(new FrmMain());

至此,一切准备就绪,按 F5 或点击运行按钮,然后点击菜单,就可以看到子窗体一个个乖乖地出现了!

总结

WinForm MDI 模式就像是窗体管理大师,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用,减少了视野中的混乱,在这个统一的界面里,用户就能轻松上手,享受程序带来的便利,各位小窗体还有机会共享主窗体的资源,真是个团宠。

当然,多个子窗体的管理也会带来一些小挑战,像是每个子窗体的生命周期管理,还有子窗体之间需要传递的参数、事件,若管理失当,可能导致代码变得像战场一样乱七八糟,甚至引发内存泄漏的悲剧。

不过,别担心,MDI 模式在适合多文档处理的场景中绝对是一种强大的设计模式。在设计与实现时,只需综合考虑业务流程逻辑,就能避免那些小小的 "安全隐患" 了。

你觉得 WinForm MDI 模式的风格和性能怎么样?欢迎留言分享你的想法!

往期精彩

闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?

常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来!