StartPosition CenterScreen не работает после изменения размера формы в Form.Load - PullRequest
2 голосов
/ 03 апреля 2020

В событии «Загрузка формы» я динамически добавляю некоторые элементы управления в форму.
Я использую этот код для изменения размера формы, чтобы адаптировать ее размер к новому содержимому:

this.MaximumSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
this.AutoSize = true;
this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

Это работает нормально, но StartPosition = FormStartPosition.CenterScreen не работает должным образом:
Положение центра формы рассчитывается на основе исходного размера.

1 Ответ

1 голос
/ 03 апреля 2020

Я предлагаю изменить размер формы, используя ее PreferredSize свойство. Когда вы добавили новые элементы управления в форму, и эти элементы управления не помещаются в клиентскую область, PreferredSize обновляется, чтобы отразить новый размер, необходимый для их содержания, но ограниченный установленными MaximumSize формы.
Затем используйте метод CenterToScreen () , чтобы центрировать форму на текущем экране.

CenterToParent () , предложенный Хансом Пассантом в комментариях, имеет тот же эффект, если форма не связана с какой-либо другой формой, т. Е. Если она не отображается с использованием метода .Show(this) перегрузки; в противном случае он центрируется на Форме владельца.

Настройка AutoSizeMode = AutoSizeMode.GrowAndShrink (или вызов метода SetAutoSizeMode()) и , тогда настройка AutoSize = true может привести к нежелательным результатам. Более заметным является то, что вы больше не можете изменять размер своей формы обычными средствами. Площадь, занимаемая StatusStrip, не может считаться et c.

В качестве примечания: если ваше приложение не является DpiAware, размеры экрана и размер вашей формы могут отличаться от ожидаемых. Если это не так, прочитайте об этом здесь:

Поддержка высокого DPI в Windows Формах

Эти заметки о Screen и VirtualScreen могут также будет полезно:


Итак, добавьте свои элементы управления в форму (возможно, в обработчик Load), затем:

var screen = Screen.FromHandle(this.Handle);
this.MaximumSize = new Size(screen.WorkingArea.Width, screen.WorkingArea.Height);
this.ClientSize = this.PreferredSize;
this.CenterToScreen();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...