如何将CenterParent转换为非模态形式

时间:2011-12-19 19:43:17

标签: c# winforms forms parent-child centering

我有一个非模态子表单,它从父表单打开。我需要将子表单居中到其父表单。我已将子表单的属性设置为CenterParent并尝试了此操作:

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

但无济于事。这适用于模态形式,但非模态形式则不然。任何简单的解决方案,还是需要我通过所有数学计算来确定其位置为中心?

4 个答案:

答案 0 :(得分:57)

我担心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);

答案 1 :(得分:10)

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();

答案 2 :(得分:4)

对于无模式形式,这是解决方案。

如果您想在父表单的中心显示无模式对话框,则需要将子表单的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

答案 3 :(得分:3)

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