【问题标题】:Tips on setting the window state of a Windows Forms window有关设置 Windows 窗体窗口的窗口状态的提示
【发布时间】:2011-01-17 16:17:30
【问题描述】:

我有一个打开 MDI 子窗体的 Windows 窗体应用程序。当我选择这些表单时,我需要将其窗口状态设置或呈现为最大化。问题是,当我在打开的表单之间导航时,它会恢复到正常的窗口状态,而当我再次将窗口状态设置为最大化时,它会显示从正常状态到最大化状态的转换,并且看起来不太好。

如何创建具有 MDI 父窗体的 Windows 应用程序,该窗体在最大化窗口状态下打开许多 MDI 子窗体?

【问题讨论】:

  • 是的,这很清楚,但是让我问您:您是否愿意使用 MDI 的替代品,并“放弃”您现在使用的 MDI 的任何其他“功能”?我认为如果您确切地说出您(或运行时最终用户)如何“在打开的表单之间导航”也很有价值:通过 MDI 父表单上的菜单?还是……?
  • 是的。在父级中,有一个选择其子级的菜单。我可以使用什么替代方案?是tabcontrol吗?
  • 因此,“放弃”MDI“功能”对您来说没有问题,当您最小化“子”表单(设置为 MDIParent 表单的表单的 MDIParent 属性)时,它会下降到 TitleBar 可见的父 MDI 窗体的底部?您是否正在使用 MDI 的“自动窗口菜单功能”,如下所述:msdn.microsoft.com/en-us/library/ms171654(VS.100).aspx?如果你把 MDI 抛在脑后,放弃它没问题吗?

标签: c# winforms mdiparent


【解决方案1】:

这是一个基于使用 MDI“父表单和子表单范例”的答案,假设如下:

  1. 您的 MDIParentForm 上有一个 MenuStrip 控件 'Dock = 'Top,并且您已经实现了自动 MDI &Window 菜单处理程序,如下所述:How to: Create an MDI Window List with MenuStrip

  2. 您正在创建新的子表单:

    一个。没有MaximizeBox、MinimizeBox等,但可能有ControlBox(用于关闭它们)

    b.这些子表单可以调整大小,也可以不调整:我们不会在这里考虑它的含义。

  3. 您希望这些 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();
    }

此时,停靠样式 'Fill 应用于子窗体将使它们全屏显示,并防止它们遮挡 MDIParentForm 菜单:并且该菜单将允许您自动选择哪个是最前面的。

现在,如果您想做一些更有趣的事情:比如调整子窗体的大小、平铺它们、层叠它们。您将不得不更改这些子窗口的 'Dock 属性:然后您可以使用内置的 MDI 范例窗口排列工具,如下所述:How to: Arrange MDI Child Forms

如果您想创建一种类型的预定义子表单的多个实例:How to Create MDI Child Forms ...请参阅有关如何使用“新菜单项:可能有用”的示例。

【讨论】:

    【解决方案2】:

    如果您希望窗口状态始终处于最大化状态,我建议您不要使用 MDI 表单。在这种情况下,TabControl 可能会更好。

    MDI 表单存在不少可用性问题,这就是它们不再常用的原因,并且往往被其他控件/选项所取代。

    【讨论】:

    • tabcontrol 的问题是,每个子窗体使用了很多控件。
    • 这是个问题,因为...?您可以将它们放入 UserControl 中,并将每个 UserControl 托管在一个选项卡中。您甚至可以在显示选项卡时按需创建它们,并且它的开销与 MDI 表单相同(或更低)。
    【解决方案3】:

    阅读 Reeds 的回答,尤其是您的评论后:

    tabcontrol 的问题是,我有一个 每个子窗体使用了很多控件

    也许这会有所帮助: 不要将您的控件放入Winform。而是将它们封装到 UserControl 中(也许通过将继承从 Form 更改为 UserControl 已经可以工作了)。

    现在将每个 UserControl 放在它自己的 TabPage 上,并将其 Dock 属性设置为 Fill。现在您可以自行更改每个 UserControl,而不会干扰另一个 TabPage 上的另一个控件(只要您没有建立任何连接)。

    【讨论】:

    • Forms 也可以在 TabPages 中毫无问题地使用(您可能想要关闭不需要的 Form 视觉元素):但是,由于 UserControls “重量更轻”,也许这是最好的方法它。一旦将 UserControl(或 Form)添加到 TabPage 的 Controls 集合中,您就只能访问顶级属性:如果您更改“源”UserControl 或 Form:您将需要重新构建项目(没什么大不了的)。我的习惯是在“主窗体”的 Form Load 事件的代码中填充 TabPages(如果它们仅用于保存 UserControl),但这只是个人喜好。
    【解决方案4】:

    如果你打算放弃 MDI,你可以看看像 WeifenLuoDigitalRune 这样的对接框架。这些是免费的,对于其他选项,您可以在这里查看:http://windowsclient.net/downloads/folders/controlgallery/tags/Windows+Forms+Docking+Windows/default.aspx


    编辑:

    如果我没记错的话,DigitalRune 允许使用 Windows 窗体作为停靠内容的容器,因此迁移工作量会更小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 2021-08-25
      • 2011-03-04
      • 1970-01-01
      • 2022-11-15
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多