我有一个打开 MDI 子窗体的 Windows 窗体应用程序。当我选择这些表单时,我需要将其窗口状态设置或呈现为最大化。问题是,当我在打开的表单之间导航时,它会恢复到正常的窗口状态,当我再次将窗口状态设置为最大化时,它会显示从正常状态到最大化状态的转换,并且看起来不太好。
如何创建具有 MDI 父窗体的 Windows 应用程序,该窗体在最大化窗口状态下打开许多 MDI 子窗体?
如果您希望窗口状态始终最大化,我建议您从 MDI 表单切换。在这种情况下,TabControl 可能会更好地工作。
MDI 表单有很多可用性问题,这就是它们不再常用的原因,并且往往被其他控件/选项替换。
这是基于使用 MDI“父表单和子表单范例”的答案,并具有以下假设:
您的 MDIParentForm 上有一个 MenuStrip 控件 'Dock = 'Top,并且您已经实现了自动 MDI &Window 菜单处理程序,如:如何:使用 MenuStrip 创建 MDI 窗口列表
您正在创建新的子表单:
一个。没有 MaximizeBox、MinimizeBox 等,但可能有 ControlBox(用于关闭它们)
湾。这些子表单可以调整大小或不可调整:我们不会在这里考虑它的含义。
您希望这些 MDIChildForms 在 MDIParent Form 中最大化显示,但不要遮挡 MDIParentForm 的菜单。
好的:假设您已经完全设计了所有子表单,“等待中”:我们可能会在您的 MDIParentForm 代码中看到类似这样的代码:
// create instances of your child forms
Form2 f2 = new Form2();
Form3 f3 = new Form3();
Form4 f4 = new Form4();
Form5 f5 = new Form5();
private void MDIParentForm1_Load(object sender, EventArgs e)
{
f2.Text = "subForm1";
f3.Text = "subForm2";
f4.Text = "subForm3";
f5.Text = "subForm4";
f2.MdiParent = this;
f3.MdiParent = this;
f4.MdiParent = this;
f5.MdiParent = this;
f2.Dock = DockStyle.Fill;
f3.Dock = DockStyle.Fill;
f4.Dock = DockStyle.Fill;
f5.Dock = DockStyle.Fill;
f2.Show();
f3.Show();
f4.Show();
f5.Show();
}
此时,应用到子窗体的停靠样式“填充”将使它们全屏显示,并防止它们遮挡 MDIParentForm 菜单:并且该菜单将允许您自动选择哪个是最前面的。
现在,如果你想做一些更有趣的事情:比如调整子窗体的大小、平铺它们、级联它们。您将不得不更改这些子窗口的“停靠”属性:然后您可以使用内置的 MDI 范例窗口排列工具,如下所述:如何:排列 MDI 子窗体
如果您想创建一种类型的预定义子表单的多个实例:如何创建 MDI 子表单...请参阅有关如何使用“新菜单条目”的示例:可能会很有用。
在阅读了 Reeds 的回答,尤其是您的评论后:
tabcontrol 的问题是,我每个子表单使用了很多控件
也许这会有所帮助:不要将控件放入Winform
. 而是将它们封装成 a UserControl
(也许它已经通过将继承从 更改为Form
来工作UserControl
)。
现在将每个 UserControl 放在它自己的 TabPage 上,并将其 Dock 属性设置为 Fill。现在您可以自己更改每个 UserControl,而不会干扰另一个 TabPage 上的另一个控件(只要您没有建立任何连接)。
如果你打算放弃 MDI,你可以看看WeifenLuo或DigitalRune 之类的对接框架。这些是免费的,对于其他选项,您可以在这里查看:http: //windowsclient.net/downloads/folders/controlgallery/tags/Windows+Forms+Docking+Windows/default.aspx
编辑:
如果我没记错的话,DigitalRune 允许使用 Windows 窗体作为停靠内容的容器,因此迁移工作量会更小。