Как CenterParent немодальной формы - PullRequest
22 голосов
/ 19 декабря 2011

У меня есть немодальная дочерняя форма, которая открывается из родительской формы.Мне нужно отцентрировать дочернюю форму к ее родительской форме.Я установил свойство дочерней формы на CenterParent и попробовал это:

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

, но безрезультатно.Это работает с модальной формой, но не с немодальными формами.Любое простое решение, или мне нужно пройти через все эти математические вычисления, чтобы зафиксировать его положение в центре?

Ответы [ 4 ]

57 голосов
/ 19 декабря 2011

Боюсь, 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);
11 голосов
/ 10 июля 2012

Кажется действительно странным, что Show (this) не ведет себя так же, как ShowDialog (this) с центрированием формы. Все, что я могу предложить, - это аккуратное решение 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();
4 голосов
/ 08 марта 2013

Для немодальной формы это решение.

Если вы хотите показать немодальное диалоговое окно в центре родительской формы, вам необходимо установить 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 голосов
/ 19 декабря 2011
Form2 f = new Form2();
f.StartPosition = FormStartPosition.CenterParent;
f.Show(this);
...