前言
嗨,各位码农们!今天我们要来聊聊如何在 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 模式的风格和性能怎么样?欢迎留言分享你的想法!
往期精彩
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来!