如何将一个非模态表单中心化

本文关键字:一个 模态 表单 中心化 | 更新日期: 2023-09-27 18:18:14

我有一个从父窗体打开的非模态子窗体。我需要将子窗体居中到其父窗体。我已经将子窗体的属性设置为CenterParent,并尝试了这个:

Form2 f = new Form2();
f.Show(this);

,但无济于事。这适用于情态形式,但不适用于非情态形式。有简单的解吗,还是需要我通过数学计算把它固定在中心位置?

如何将一个非模态表单中心化

恐怕StartPosition.CenterParent只适用于模式对话框(.ShowDialog)。
您必须像这样手动设置位置:

Form f2 = new Form();
f2.StartPosition = FormStartPosition.Manual;
f2.Location = new Point(this.Location.X + (this.Width - f2.Width) / 2, this.Location.Y + (this.Height - f2.Height) / 2);
f2.Show(this);

Show(this)的行为方式与ShowDialog(this)的w.r.t窗体居中方式不同,这似乎真的很奇怪。我所要提供的是Rotem的解决方案,以一种简洁的方式隐藏了黑客的变通方法。

创建一个扩展类:
public static class Extension
{
    public static Form CenterForm(this Form child, Form parent)
    {
        child.StartPosition = FormStartPosition.Manual;
        child.Location = new Point(parent.Location.X + (parent.Width - child.Width) / 2, parent.Location.Y + (parent.Height - child.Height) / 2);
        return child;
    }
}

以最小的麻烦调用它:

var form = new Form();
form.CenterForm(this).Show();

对于非模态表单,这就是解决方案。

如果你想在父窗体的中心显示一个非模态对话框,那么你需要将子窗体的StartPosition设置为FormStartPosition.Manual

form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(parent.Location.X + (parent.Width - form.Width) / 2, parent.Location.Y + (parent.Height - form.Height) / 2);
form.Show(parent);

在。net Framework 4.0中-如果你将子窗体的ControlBox属性设置为false, FormBorderStyle属性设置为NotSizable,如下所示:

form.ControlBox = false;
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
如果StartPosition设置为FormStartPosition.Manual,那么您将面临子窗体部分不显示的问题。

要解决这个问题,您需要将子窗体的Localizable属性设置为true

Form2 f = new Form2();
f.StartPosition = FormStartPosition.CenterParent;
f.Show(this);