C# MDI窗体的常见操作(附带实例)
窗体是所有界面的基础,这就意味着为了打开多个文档,需要具有能够同时处理多个窗体的能力的应用程序。为了满足这个需求,可以使用 MDI 窗体,即多文档界面。
本节将对 MDI 窗体进行详细讲解。
MDI 窗体用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗体中通常有包含子菜单的窗口菜单,用于在窗口或文档之间进行切换。
MDI 窗体十分常见,如下图所示:

图 1 MDI窗体界面
MDI 窗体的应用非常广泛。例如,如果某公司的库存系统需要实现自动化,则需要使用窗体来输入客户和货物的数据、发出订单及跟踪订单。这些窗体必须链接或者从属于一个界面,并且能够同时处理多个文件。这样,就需要建立MDI窗体以解决这些需求。
当 MDI 应用程序启动时,首先会显示父窗体。所有的子窗体都在父窗体中打开,在父窗体中可以随时打开多个子窗体。每个应用程序只能有一个父窗体,其他子窗体不能移出父窗体的框架区域。
下面介绍如何将窗体设置成父窗体或子窗体。

图 2 设置父窗体
例如,将 Form2、Form3 这两个窗体设置成子窗体,并且在父窗体中打开这两个子窗体,代码如下:
可以通过使用带有 MdiLayout 枚举的 LayoutMdi() 方法来排列多文档界面父窗体中的子窗体,其语法如下:
1) 新建一个 Windows 窗体应用程序,命名为 Demo,默认窗体为 Form1.cs。
2) 将窗体 Form1 的 IsMdiContainer 属性设置为 true,并作为 MDI 父窗体,接着添加 3 个 Windows 窗体,作为 MDI 子窗体。
3) 在 Form1 窗体中添加一个 MenuStrip 控件,作为该父窗体的菜单项。
4) 通过 MenuStrip 控件建立 4 个菜单项,分别为“加载子窗体”、“水平平铺”、“垂直平铺”和“层叠排列”。运行程序时,单击“加载子窗体”菜单项后,可以加载所有的子窗体,代码如下:
5) 加载所有的子窗体之后,单击“水平平铺”菜单项,使窗体中所有的子窗体水平排列,代码如下:
6) 单击“垂直平铺”菜单项,使窗体中所有的子窗体垂直排列,代码如下:
7) 单击“层叠排列”菜单项,使窗体中所有的子窗体层叠排列,代码如下:

图 3 加载所有的子窗体
单击“水平平铺”菜单项,效果如下图所示:

图 4 水平平铺子窗体
单击“垂直平铺”菜单项,效果如下图所示:

图 5 垂直平铺子窗体
单击“层叠排列”菜单项,效果如下图所示:

图 6 层叠排列子窗体
本节将对 MDI 窗体进行详细讲解。
MDI窗体的概念
多文档界面即 Multiple-Document Interface,简称 MDI。MDI 窗体用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗体中通常有包含子菜单的窗口菜单,用于在窗口或文档之间进行切换。
MDI 窗体十分常见,如下图所示:

图 1 MDI窗体界面
MDI 窗体的应用非常广泛。例如,如果某公司的库存系统需要实现自动化,则需要使用窗体来输入客户和货物的数据、发出订单及跟踪订单。这些窗体必须链接或者从属于一个界面,并且能够同时处理多个文件。这样,就需要建立MDI窗体以解决这些需求。
设置MDI窗体
在 MDI 窗体中,起到容器作用的窗体被称为“父窗体”,可以放在父窗体中的其他窗体被称为“子窗体”,或者“MDI子窗体”。当 MDI 应用程序启动时,首先会显示父窗体。所有的子窗体都在父窗体中打开,在父窗体中可以随时打开多个子窗体。每个应用程序只能有一个父窗体,其他子窗体不能移出父窗体的框架区域。
下面介绍如何将窗体设置成父窗体或子窗体。
1) 设置父窗体
如果要将某个窗体设置为父窗体,则只需在窗体的“属性”窗口中,将 IsMdiContainer 属性设置为 True 即可,如下图所示:
图 2 设置父窗体
2) 设置子窗体
设置完父窗体后,通过设置某个窗体的 MdiParent 属性来确定子窗体,其语法如下:public Form MdiParent { get; set; }其中属性值为 MDI 父窗体。
例如,将 Form2、Form3 这两个窗体设置成子窗体,并且在父窗体中打开这两个子窗体,代码如下:
Form2 frm2 = new Form2(); // 创建Form2窗体的对象 frm2.MdiParent = this; // 设置MdiParent属性,将当前窗体作为父窗体 frm2.Show(); // 使用Show方法打开窗体 Form3 frm3 = new Form3(); // 创建Form3窗体的对象 frm3.MdiParent = this; // 设置MdiParent属性,将当前窗体作为父窗体 frm3.Show(); // 使用Show方法打开窗体
排列MDI子窗体
如果一个 MDI 窗体中有多个子窗体同时被打开,假如不对其排列顺序进行调整,那么界面会非常混乱,而且不方便浏览。如何解决这个问题呢?可以通过使用带有 MdiLayout 枚举的 LayoutMdi() 方法来排列多文档界面父窗体中的子窗体,其语法如下:
public void LayoutMdi (MdiLayout value)参数 value 用来定义 MDI 子窗体的布局,它的值是 MdiLayout 枚举值之一。MdiLayout 枚举用于指定 MDI 父窗体中子窗体的布局,其枚举成员及说明如下表所示。
枚举成员 | 说明 |
---|---|
Cascade | 所有 MDI 子窗体均层叠在 MDI 父窗体的工作区内 |
TileHorizontal | 所有 MDI 子窗体均水平平铺在 MDI 父窗体的工作区内 |
TileVertical | 所有 MDI 子窗体均垂直平铺在 MDI 父窗体的工作区内 |
C# MDI窗体实例
排列 MDI 父窗体中的多个子窗体,程序开发步骤如下:1) 新建一个 Windows 窗体应用程序,命名为 Demo,默认窗体为 Form1.cs。
2) 将窗体 Form1 的 IsMdiContainer 属性设置为 true,并作为 MDI 父窗体,接着添加 3 个 Windows 窗体,作为 MDI 子窗体。
3) 在 Form1 窗体中添加一个 MenuStrip 控件,作为该父窗体的菜单项。
4) 通过 MenuStrip 控件建立 4 个菜单项,分别为“加载子窗体”、“水平平铺”、“垂直平铺”和“层叠排列”。运行程序时,单击“加载子窗体”菜单项后,可以加载所有的子窗体,代码如下:
private void 加载子窗体ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); // 创建Form2窗体的对象 frm2.MdiParent = this; // 设置MdiParent属性,将当前窗体作为父窗体 frm2.Show(); // 使用Show方法打开窗体 Form3 frm3 = new Form3(); // 创建Form3窗体的对象 frm3.MdiParent = this; // 设置MdiParent属性,将当前窗体作为父窗体 frm3.Show(); // 使用Show方法打开窗体 Form4 frm4 = new Form4(); // 创建Form4窗体的对象 frm4.MdiParent = this; // 设置MdiParent属性,将当前窗体作为父窗体 frm4.Show(); // 使用Show方法打开窗体 }
5) 加载所有的子窗体之后,单击“水平平铺”菜单项,使窗体中所有的子窗体水平排列,代码如下:
private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileHorizontal); // 使用MdiLayout枚举实现窗体的水平平铺 }
6) 单击“垂直平铺”菜单项,使窗体中所有的子窗体垂直排列,代码如下:
private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileVertical); // 使用MdiLayout枚举实现窗体的垂直平铺 }
7) 单击“层叠排列”菜单项,使窗体中所有的子窗体层叠排列,代码如下:
private void 层叠排列ToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.Cascade); // 使用MdiLayout枚举实现窗体的层叠排列 }运行程序,单击“加载子窗体”菜单项,效果如下图所示:

图 3 加载所有的子窗体
单击“水平平铺”菜单项,效果如下图所示:

图 4 水平平铺子窗体
单击“垂直平铺”菜单项,效果如下图所示:

图 5 垂直平铺子窗体
单击“层叠排列”菜单项,效果如下图所示:

图 6 层叠排列子窗体