一、参照自带例子做个mdi窗体
1、加入父窗体MainForm,并加入一个菜单栏,new form1 form2 windows
2、给new加命令
private int childFormNumber = 0;
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
Form childForm = new Form();//创建一个子窗体
childForm.MdiParent = this;//这一句很重要
childForm.Text = "窗口" + childFormNumber++;//窗体标题
childForm.Show();//显示之

}
现在试一下,按菜单new能生成子窗体了。但是,当所有的子窗体最大化,下面的会被最前面的挡住,如何把它们找出来呢?这就要用到菜单windows项了(不一定要叫windows,随便的),
3、网上都说把windows菜单的MdiWindowListItem属性设为true, 不过我在vs2008中没有找到。可以这样设置,打开MainForm.Designer.cs,在“Windows 窗体设计器生成的代码”一段中加一句“this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;”(当你们的菜单名称不一样时自己改)。现在,再按菜单new后,windows下面会自动加入新生成的子窗体名称,跟word一样。

二、显示自己制作的窗体。
其实上面的例子没有多在实际用处,除非每个人都去编写字板。好,现在做一个小小的改进。在子窗体中显示自己制作的窗体。
在工程中新建两个窗体Form1,Form2,分别给form1和form2菜单加入命令。
private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1();
form1.MdiParent = this;
form1.Show();
}

private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.MdiParent = this;
form2.Show();
}
现在点击form1和form2后,能在子窗体中分别显示工程中的Form1和Form2窗体了。但是这也没有实际用处(网上很多教程都止于这一步),因为当你点击了两下form1后,子窗体中会显示两个一模一样的Form1窗体,实际编程中显然是没用的,比如我的工程项目中想在Form1窗体中设置几个参数,Form1只要显示一个就够了。下面再做点改进,
private static Form1 form1;
private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (form1==null ||form1.IsDisposed){
form1 = new Form1();
form1.MdiParent = this;
form1.Show();}
else { form1.Activate(); }
}

private static Form2 form2;
private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (form2 == null || form2.IsDisposed)
{
form2 = new Form2();
form2.MdiParent = this;
form2.Show();
}
else { form2.Activate(); }
}
这样,Form1和Form2窗体只会被实例化一次。即当Form1窗体显示时,再点击form1时,Form1不会再创建一个,而只是把在下面的提到最前面显示,变成激活的活动窗体。

三、题外话:MDI容器不能使用toolStripContainer,可以用ToolStripPanels代替。

转载于:https://blog.51cto.com/aini13/959523

C# 窗体实例化一次相关推荐

  1. 单例模式——解决MDI子窗体实例化的问题

    机房收费系统进行有一段时间了,但是始终有些历史遗留问题.比如,如何MDI子窗体如何显示在上层的问题和MDI子窗体实例化的问题. 对于如何显示在上层的问题,这次采用的还是SetParent函数,在模块里 ...

  2. 窗体跳转传值 1130

    窗体跳转传值 1130 步骤 新建项目得到主窗体 新建二号窗体 主窗体内来一个文本框和一个按钮 在文本框中输入内容,点击按钮,弹出二号窗体 二号窗体中使用主窗体文本框中用户输入的值 详情 主窗体界面 ...

  3. 窗体跳转与传值 02

    登陆成功 打开新窗体 实例化一个新窗体 新窗体.show() 传值 新窗口一实例化就传值 新窗体一加载,就把得到的名字值 赋给了窗体的Text属性 关闭窗体的代码 小结

  4. java/05/(Swing包)窗体,组件,布局管理器,面板,监听事件

    java/05/Swing包(窗体) Swing特点: 原来的AWT组件来自java.awt包,当含有AWT组件的java应用程序在不同的平台上执行时,每个平台的GUI组件的显示会有所不同,但是在不同 ...

  5. Prism V2之旅(1)

    概述 如果你在开发wpf程序,应该听说过The Composite Application Guidance for WPF(以下简称prism) 总而言之,prism是帮助你开发复杂的wpf应用程序 ...

  6. 如何订阅Form的自定义事件

    Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 .订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象.这个主体对象在自身状态变化时,会通知所 ...

  7. Java进阶篇(六)——Swing程序设计(上)

    Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容这里就不介绍了.想深入学习的朋友们可查阅有关资料 ...

  8. Delphi程序员代码编写标准指南

    Delphi 6 程 序 员 代 码 编 写 标 准 指 南 一.序言 二.通用源代码格式规则 2.1 缩格 2.2 页边空格 2.3 Begin-End 配对 2.4 代码文件中通用符号含义 三.O ...

  9. delphi编码规范文档

    delphi编码规范文档 目录 1.前言 3 2.源程序书写规范 3 2.1通用源代码格式规范 3 2.1.1缩进 3 2.1.2边距 3 2.1.3 Begin-End语句 3 2.1.4注释 4 ...

最新文章

  1. Iso时间转java instant,在java.util.Date和java.time.Instant之间转换古代日期时的差异
  2. 如何把更改后的dll图标还原回来?
  3. 分布的matlab实现_图像相似度---灰度分布算法---用matlab实现
  4. python基础list_python基础之List详解
  5. 大学生成绩管理系统(C语言)
  6. Spring IOC容器-Bean管理——基于XML方式
  7. 2021-06-01 深入分析锁升级流程的基础
  8. java文件比较_Java 比较两个任意文件是否相同
  9. 方程求根(牛顿迭代法)
  10. 前端 获取当前页面服务器ip_fiddler获取响应时间以及服务器IP
  11. WPF中改进自定义Command一些想法
  12. Linux标准化:避免重蹈UNIX的覆辙
  13. 基于随机森林模型的心脏病患者预测及可视化(pdpbox、eli5、shap、graphviz库)附相关库安装教程
  14. 【速达软件】速达5000系列、V5、S5批量更改税率
  15. cad上样条曲线上的点太多了_CAD中如何编辑样条曲线增加夹点? 看完你就知道了...
  16. 线程学习(生产者消费者问题哲学家吃饭问题)
  17. 等待输入超时:自动登出
  18. js超酷消息警告框美化插件
  19. Unity进阶 - 动画系统 - 给人物角色制作动画
  20. 用简易方法证明 n 个数的算术平均数 > 几何平均数

热门文章

  1. 前端那点事儿——Tocify自动生成文档目录
  2. mysql附件卸载_彻底卸载mysql
  3. GPU — CUDA 编程模型
  4. KVM — 安装部署
  5. 数据中心网络架构 — 云数据中心网络 — 新型叶脊二层网络架构
  6. VMware vSphere 虚拟化简介
  7. Python基本语法_集合set/frozenset_内建方法详解
  8. lcd参数解释及刷新率计算,LCD时序
  9. stm32 Boot0,Boot1引脚设置
  10. matlab-高数 find 找到集合中特定元素的位置