.NET form - настройка местоположения изменения размера - PullRequest
2 голосов
/ 08 октября 2009

Я работаю над приложением, которое отображает свои формы в виде ряда модальных окон, расположенных друг над другом. Все формы размещены в центре экрана. Когда пользователь перемещает форму по экрану, перемещается только самая верхняя, остальные остаются в центре и не могут быть перемещены, поскольку они заблокированы самым верхним диалоговым окном.

Я пытаюсь закодировать код для перемещения форм, который переместит все формы в новое местоположение, а также код, который откроет новые формы в текущем, нецентрированном месте.

Но что-то странное происходит при последнем - открытии новой формы в нецентрированной позиции с использованием Location какой-либо другой формы (самая нижняя форма). Если я установлю свойство Location формы программно, его размер изменится - форма станет меньше. Его свойство Size изменяется с (240, 320), как установлено в GUI дизайнера, на меньший ClientSize (234, 294), который присутствует в сгенерированном Designer-коде. Я нашел только один пост в сети, ссылающийся на эту проблему, но ответов на него нет. Если я оставлю свойство Location в одиночестве, форма будет отображаться правильно с исходным размером.

Начальная позиция формы установлена ​​на Вручную, FormBorderStyle - это FixedSingle, AutoScaleMode - это DPI или Font (я не знаю, как это установить).

Есть идеи? Спасибо.

1 Ответ

3 голосов
/ 08 октября 2009

Я отвечу на свой вопрос. Кажется, что поведение связано с установкой свойства Location, пока форма еще не сформирована ОС, то есть у него еще нет созданного дескриптора, и его IsHandleCreated имеет значение False. Я отлаживал в самом .NET-коде, и был вызов Debug.Assert с «Не использовать это до CreateHandle» или что-то подобное в качестве параметра assert где-нибудь в стеке вызовов вокруг кода, который был проблематичным. Это дало мне первый намек.

Помещение кода в обработчик событий для события Form.Load устранило проблему. В момент запуска Load дескриптор уже создан, и все, кажется, работает.

Теперь, когда я знаю причину, я немного искал в сети запрос «Инициализация обработчика событий по сравнению с Load» и соответствующие обсуждения подразумевают, что вам нужно отложить обработку элементов управления до Load. Это имеет смысл, поскольку элементы управления .NET являются обертками вокруг сущностей вне ОС (и их необходимо создавать, чтобы их можно было использовать), но в то же время не имеет смысла, поскольку код Designer, по-видимому, может получить доступ к элементам управления до того, как ручка создана просто отлично. Если это имеет какой-то смысл ..

TLDR: отложить управление доступом и использовать до тех пор, пока не сработает событие Form.Load.

...