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

news2024/11/16 9:42:50

image

前言

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

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

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

Step By Step 步骤

  1. 创建一个 WinForm 类型的项目

  2. 添加三个 Windows 窗体

    • FrmMain.cs(主窗体)
    • FrmTest1.cs(这俩是小弟,也就是子窗体)
    • FrmTest2.cs
  3. 打开 FrmMain 窗体设计器,修改以下属性

    • Text: MDI 主窗体
    • Size: 1000,600
    • StartPosition: CenterScreen
    • IsMdiContainer: True(重要,将窗体设置为 MDI 容器
    • 其它属性默认值即可
  4. 拖拽一个 MenuStrip 控件到 FrmMain 窗体设计器里,并将 MenuStrip 控件改名为 MenuFuns

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

    • 打开窗体1,同时将菜单项改名为 menuOpenWin1
    • 打开窗体2,同时将菜单项改名为 menuOpenWin2
  6. 分别双击这两个菜单项,自动生成菜单项的单击事件,如:

    private void menuOpenWin1_Click(object sender, EventArgs e)
    {
    	
    }
    
    private void menuOpenWin2_Click(object sender, EventArgs e)
    {
    	
    }
    
  7. 在这两个事件里写上打开相应子窗体的代码,最终代码如下:

    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();
    		}
    	}
    }
    
  8. 打开 Program.cs 文件,设置启动窗体为 FrmMain 窗体,如:

    Application.Run(new FrmMain());
    
  9. 至此,一切准备就绪,按 F5 或点击运行按钮,然后点击菜单,就可以看到子窗体一个个乖乖地出现了!

总结

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

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

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

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

往期精彩

  1. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  2. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的线上教学平台系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架,Java语言 工具 IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能模块 学员功能模块 前台首页…

16行为型设计模式——策略模式

一、策略模式简介 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,将每一个算法封装起来,并使它们可以相互替换。具体的算法选择交由客户端决定,即不同的算法可以在运行时动态地&a…

后端微服务架构:构建分布式博客系统

后端微服务架构:构建分布式博客系统 在当今的软件开发领域,微服务架构已经成为构建可扩展、灵活且易于维护的应用程序的主流选择。本文将探讨如何利用微服务架构来设计和实现一个分布式的博客系统。 1. 微服务架构简介 微服务架构是一种将应用程序分解…

练习题 期望dp

题目 分析: 首先注意到期望有线性性: E ( a b ) E ( a ) E ( b ) E(ab)E(a)E(b) E(ab)E(a)E(b),其中 a a a、 b b b不要求相互独立。 因为网上很多地方的证明不严谨,所以这里证明一下: E ( a b ) ∑ i i ⋅ P …

C语言基础(十八)

1、共用体(Union)是一种特殊的数据类型,也被称为联合体,它允许在相同的内存位置存储不同的数据类型,每次只能存储其中一种类型的值。共用体是一种数据结构,多个不同类型的变量能够共享同一段内存空间。在C语…

OpenAI推出新功能:GPT-4o正式上线微调功能,限时免费!

GPT-4o正式上线微调功能,限时免费! 每个组织每天可以免费获得多达100万个训练token,活动将持续到9月23日。 这意味着开发者们现在可以利用自定义数据集对GPT-4o进行微调,从而以较低的成本构建自己的应用程序。 据悉,G…

推荐3款在Windows系统上运行流畅、音质出众的音乐播放器

foobar2000 Foobar2000是一款由原Winamp开发公司的Peter Pawlowski开发的免费多功能音频播放器,具有高度定制化和丰富的功能。它支持多种音频格式,包括MP3、AAC、WMA、FLAC、WAV等,并且可以进行音频转码和格式转换。此外,Foobar20…

C盘满了,如何清理C盘

目录 磁盘清理删除休眠文件查看系统盘的存储占比卸载掉安装在系统盘的软件更改临时文件、文档等的存储位置 磁盘清理 选择自己的系统盘,我的是G盘。清理系统文件删除休眠文件 删除休眠文件 管理员打开cmd powercfg -h off 直接减少几个g的C盘占用 查看系统盘的存储…

世媒讯海外发稿:全球知名的中文媒体平台

新闻媒体网站专注于媒体行业中各类新闻的网站,也是网友最爱访问的网站类型之一。以下是一些知名的中文媒体平台,它们不仅提供华文内容,还具有较高的访问量和影响力。以下是十大可发布中文新闻稿的知名媒体,包括其月访问量、地区排…

【连续4届EI稳定检索】第五届计算机工程与智能控制学术会议(ICCEIC 2024,10月11-13)

第五届计算机工程与智能控制学术会议(ICCEIC 2024)将于2024年10月11日至13日在广州举办,聚焦计算机工程与智能控制前沿,涵盖网络安全、硬件系统、软件工程、嵌入式创新等多个核心议题及交叉学科研究。 ICCEIC 2024将计算机工程和智…

QT 程序直接崩溃The program has unexpectedly finished.

QT报错比较难处理,因为给出的控制台输出太宽泛甚至没有信息。 遇到当遇到这种直接崩溃的,试着把一些代码注释掉,慢慢试出出错的位置 。 这里有一种可能的原因是因为有些变量没有初始化,就直接使用。 如下图: 当我运…

【Java】/* 二叉树 - 底层实现*/

一、前序遍历 - 递归 /* 1. 前序遍历 - 递归 */public void preOrder(TreeNode root) {//1. 如果根节点为nullif (root null) {return;}//本意:打印树的根,左,右节点//2. 打印根节点的值System.out.print(root.val " ");//3. 如…

X86 PVE 下安装路由存储系统iStoreOS

简介 iStoreOS是一个比较易用的路由存储系统,它能让你获得更好的网络及 存储的体验。 系统本身开源免费,目前系统代码开源在:Github iStoreOS 下载固件 固件下载:https://fw.koolcenter.com/iStoreOS/x86_64/ istoreos-22.03.7…

数据结构——顺序表和单链表

数据结构 基本概念: 数据结构是一门研究如何有效组织数据,并提高数据处理效率的学科。通过研究各种数据内部的逻辑关系,使用某种特定的存储形式,并在此基础上对数据实施各种操作,这些工作被称为称为广义上的算法。 …

盈利47亿,快手的危机感却没消失

文丨郭梦仪 又是一年互联网大厂的半年报成绩单放榜时,一批主打下沉市场的公司也在从追求高增长,转向了高利润。 8月20日盘后,快手发布了“营利双增”的业绩报告,但显然营收增长远远低于利润的增长。 伴随着与抖音停战&#xff…

选择排序【详解】

本期介绍🍖 主要介绍:排序中的选择排序。 文章目录 1. 前言2. 选择排序3. 优化选择排序 1. 前言 相信只要接触过C语言的同学都或多或少了解排序问题,其中最基本,且最为人所熟知的排序是:选择排序。下面我会带着大家重新…

深入解读LLaMA-Factory

转自:老朱读AI 1、介绍 LLaMA-Factory是一个开源平台,旨在为研究人员和开发者提供便捷的大型语言模型微调环境。通过LLaMA-Factory,用户可以轻松地加载预训练模型,调整模型参数,并在特定数据集上进行训练&#xff0c…

【Python机器学习】NLP分词——利用分词器构建词汇表(六)——词汇表归一化

目录 大小写转换 词干还原 词形归并 使用场景 词汇表大小对NLP流水线的性能有很大的影响,有一种减少词汇表大小的方法是将词汇表归一化以便意义相似的词条归并成单个归一化的形式。这样做一方面可以减少需要再词汇表中保留的词条数,另一方面也会提高…

记录|Visual Studio中的Git上传下载使用

目录 前言一、前提准备Step1 仓库准备Step2. 本地仓库和远程仓库绑定当前效果展示 二、下载更新内容到本地仓库情形Step1. 下载 三、更新内容,上传文件到远程仓库情形Step1. 下载Step2. 上传当前效果展示 更新时间 前言 这部分是使用过程中的经验 一、前提准备 St…

【数模资料包】最新数模国赛word+latex模版|数模常用的算法python+matlab代码

【2024最全国赛研赛数模资料包】C君珍贵国一数模资料|最新数模国赛wordlatex模版|数模常用的算法pythonmatlab代码 国赛指:高教社杯全国大学生数学建模竞赛,研赛指:华为杯研究生数学建模竞赛。资料内容具体看文末卡片…