Windows MDI子窗体无法在最大化状态下打开

3

我将一个表单设置为MDI表单的子表单,该MDI表单的WindowState已设置为最大化。

当我从MDI容器中打开该表单时,它并未以最大化状态打开。为什么会出现这种情况,我该如何使其最大化打开?

以下是我从mdi容器中显示子表单的方法。

private void ShowNewForm(object sender, EventArgs e)
{
    FormChild childForm = new FormChild ();
    childForm.MdiParent = this;
    childForm.WindowState = FormWindowState.Maximized;
    childForm.Text = "Window " + childFormNumber++;
    childForm.Show();
}

你能分享打开子窗口的代码吗? - Fredrik Mörk
你设置了 yourform.MdiParent = frameform 吗? - Dmitry Karpezo
如果您已将其WindowState设置为最大化,则它应该仅以最大化模式打开。 - VJOY
就我所看到的,这段代码是正确的。我甚至创建了一个仅包含 MDI 容器窗体和单个子窗体的外壳项目。有可能它正在函数之外被修改,比如通过父窗体的 MDIChildren 属性吗? - StyxRiver
请发布能够真正复现问题的代码。 - Hans Passant
14个回答

11

找到了解决这个问题的最佳方法。只需使用两行代码:

frm r = new frm();
r.MdiParent = this;
r.Show();
r.WindowState = FormWindowState.Minimized;
r.WindowState = FormWindowState.Maximized;

事实证明,如果先将表单最小化,然后再最大化,就可以获得所需的结果!

1
你所写的代码之所以有效,是因为窗体状态在显示后才发生了改变,而不是因为进行了两次窗体状态更改。 - Mickael Bergeron Néron
Mickael,有一个小问题;如果在窗体显示之前已经将WindowState设置为Maximized,再次最大化它是没有用的,最小化和最大化会解决这个问题。 - Mikko Lassila

5

框架确实存在一个 bug。如果你从 GUI 中将 WindowState 设置为 Maximized,框架似乎会感到困惑。你最终会得到一种奇怪的状态,介于最大化和默认大小之间。

混合 MdiChild 状态的图片

如果像这样设置了 WindowState,在代码中尝试更正将被忽视。下面的代码生成了上面的图像。

private void ShowNewForm(object sender, EventArgs e)
    {
        Form1 childForm = new Form1();
        childForm.MdiParent = this;
        childForm.Text = "Window " + childFormNumber++;
        childForm.Show();
        childForm.WindowState = FormWindowState.Maximized;
    }

后续对ShowNewForm()的调用将正常显示,但第一个子窗体始终会出现这种行为。

只需在GUI中将WindowState返回到正常值,然后使用上述代码示例中演示的代码最大化窗体即可。

我的版本:
C# Express 10.0.40219.1 SP1
.NET 4.0.30319 SP1


3

我发现如果另一个可见的窗体调用第二个MIDChild并设置了文本,则该MDIChild将丢失其WindowState。

尝试将其注释掉。

childForm.Text = "Window " + childFormNumber++;

看看这是否能解决你的问题。在我看来,这似乎是一个框架错误。


2

按下 F4 键并将窗口状态设置为正常,以选择您的子表单。

如果您想要最大化子表单,则需要将表单属性设置为正常,并编写以下代码:

FormChild childForm = new FormChild ();
childForm.MdiParent = this;
childForm.Show();
childForm.WindowState = FormWindowState.Maximized;

2
您可以尝试以下方法:
  form1 obj = new form1 ();

  obj.MdiParent = MDIGracular.ActiveForm;

  obj.StartPosition = FormStartPosition.CenterParent;

  obj.WindowState = FormWindowState.Minimized;

  obj.Dock = DockStyle.Fill;

  obj.Show();

  obj.WindowState = FormWindowState.Maximized;

2
表单必须先显示,然后最大化!
private void ShowNewForm(object sender, EventArgs e)
{
    FormChild childForm = new FormChild ();
    childForm.MdiParent = this;
    childForm.Text = "Window " + childFormNumber++;
    childForm.Show();
    childForm.WindowState = FormWindowState.Maximized;
}

1
我终于找到了解决方案,现在它对我正常工作。当我们处理MDI表单时,框架存在问题,仅通过更改WindowState属性为最大化无法解决此问题。我们需要编写以下代码:
代码: Form1 form = new Form1 form.Dock = DockStyle.Fill;
该Dock属性将使MDIForm下的子窗体最大化,并确保所有子窗体的WindowState属性应为Normal。

1
我找到了另一种解决方案。首先,在表单中添加 System.Windows.Forms.Panel 元素。设置属性。
this.root.Dock = System.Windows.Forms.DockStyle.Fill;

然后,所有其他控件都放置在面板内。在这种情况下,FormWindowState.Maximized 可以在任何地方设置,并且可以正常工作。


0

我曾经遇到过同样的问题,但是我找到的所有方法都无法解决它。我有一个父窗口和几个子窗口。当一个子窗口关闭时,它被隐藏起来,并在再次打开时激活。

无论我尝试什么,当一个隐藏的子窗口再次被激活时,它处于半最大化状态,而没有其他子窗口打开。如果一个曾经隐藏并激活的窗口被设置为正常状态,它的标题栏会显示在父窗口后面。

现在我发现,这只发生在子窗口以最大化状态隐藏时。因此,在窗体关闭事件中将WindowState设置为Normal,然后再将窗口隐藏,一切都按预期工作。


0
FormChild childForm = new FormChild ();
childForm.MdiParent = this;

childForm.Text = "Window " + childFormNumber++;
childForm.Show();
childform.BringToFront();
childForm.WindowState = FormWindowState.Maximized;

希望它能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接