【发布时间】:2012-02-04 14:39:17
【问题描述】:
我正在开发旧版 WinForms MDI 应用程序,但在使子窗体按我想要的方式运行时遇到了一些麻烦。 我的目标是让子窗体 always 最大化(停靠)。
问题是,即使我将MaximizeBox 设置为false,最大化/调整大小按钮也会出现在 MDI 工具条中,并让用户调整(取消停靠)子窗体的大小。
避免这种情况的唯一方法是将ControlBox 设置为false,然后关闭按钮消失(这不是我想要的)。
我已经尝试使用固定的FormBorderStyle 并在触发 resize 事件时最大化子窗体,但我的方法都不起作用。
有没有我错过的超级秘密财产,或者是不可能的?
提前致以最诚挚的问候和感谢
更新
我写了一个低俗的方法(感谢@rfresia)来处理我的孩子表单,它可能会帮助遇到同样问题的其他人:
//All child forms derive from ChildForm
//Parent MDI Form implementation
//...
private void ShowForm(ChildForm form)
{
//Check if an instance of the form already exists
if (Forms.Any(x => x.GetType() == form.GetType()))
{
var f = Forms.First(x => x.GetType() == form.GetType());
f.Focus();
f.WindowState = FormWindowState.Maximized;
}
else
{
//Set the necessary properties (any other properties are set to default values)
form.MdiParent = this;
form.MaximizeBox = false;
form.MinimizeBox = false;
form.WindowState = FormWindowState.Maximized;
Forms.Add(form);
form.Forms = Forms;
form.Show();
form.Focus();
//Lets make it nasty (some forms aren't rendered properly otherwise)
form.WindowState = FormWindowState.Normal;
form.WindowState = FormWindowState.Maximized;
}
}
//...
//ChildForm implementation
//...
public List<Form> Forms { get; set; }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
Forms.RemoveAll(x => x.GetType() == GetType());
}
protected override void OnResize(EventArgs e)
{
WindowState = FormWindowState.Maximized;
}
【问题讨论】:
-
当您希望子窗体始终最大化时,使用 MDI 是没有意义的。无论如何,当您切换窗口时,MDI 会通过大量闪烁与您战斗。只需使用您交换成表单的用户控件。
-
你可能是对的,但正如我所说,这是遗留代码,我不想过多地触及它。
标签: c# winforms mdi mdichild maximize