Подтвердить что ты не робот

Как CenterParent немодальная форма

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

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

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

4b9b3361

Ответ 1

Я боюсь, что 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);

Ответ 2

Кажется странным, что 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();

Ответ 3

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

Ответ 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.