Как CenterParent немодальная форма
У меня есть немодальная дочерняя форма, которая открывается из родительской формы. Мне нужно центрировать дочернюю форму на ее родительскую форму. Я установил свойство дочерней формы CenterParent
и попробовал это:
Form2 f = new Form2();
f.Show(this);
но безрезультатно. Это работает с модальной формой, но не так с немодальными формами. Любое простое решение, или мне нужно пройти весь этот математический расчет, чтобы зафиксировать его положение в центре?
Ответы
Ответ 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
.