Какой код установки должен войти в Конструкторов Формы по сравнению с событием Form Load?

Для приложений winforms я задаюсь вопросом, во что должен войти код установки:

  • MainForm ()

в противоположность

  • MainForm_Load (возражают отправителю, EventArgs e),

Есть ли здесь какие-либо инструкции по лучшей практике?

55
задан Amro 14 March 2014 в 19:53
поделиться

2 ответа

Программисты, которые работали с VB6, обычно помещают много кода в загрузку событие, в VB6 это событие использовалось для инициализации формы. Но это больше не подходит для Windows Forms, класс Form может иметь конструктор. Способ .NET заключается в инициализации объектов класса в конструкторе. Есть очень мало веских причин не делать этого для класса Form.

Событие Load запускается сразу после создания дескриптора окна для формы, непосредственно перед тем, как он станет видимым для пользователя. Вы должны писать только код в обработчике событий, который зависит от созданного дескриптора. Существует не так много кода, который соответствует этому требованию, за исключением одного вида: кода, который требует, чтобы размер и местоположение окна были известны.

Значения свойств Size и Location во время разработки формы не совпадают с их фактическими значениями, когда форма выполняется на другом компьютере. Форму можно масштабировать в соответствии с размером системного шрифта или настройкой DPI видеоадаптера на целевом компьютере.Предпочтения пользователя тоже играют роль, пользователь мог выбрать другой размер шрифта для заголовка окна. Обычно вас это не волнует, если только вы не хотите, чтобы окно занимало определенную позицию на рабочем столе или было выровнено с каким-либо другим окном.

Написание кода в событии Load, который выполняет такие действия, как инициализация элементов управления TreeView или ListView, может значительно замедлить время запуска. Когда вы делаете это в конструкторе, Windows Forms еще не обновляет физическое окно, оно еще не создано. После создания собственного элемента управления Winforms инициализирует его массовым обновлением вместо одного узла / элемента за раз, как это происходит, когда код запускается в событии Load. Большая разница.

И последнее, но не менее важное: вы никогда не должны использовать событие Load, вы должны переопределить метод OnLoad (). Это обеспечивает выполнение кода в предсказуемом порядке, когда вы (или кто-то еще) наследуете свой класс Form. IntelliSense поможет вам написать этот метод, просто введите «protected onl» и нажмите Tab, чтобы IntelliSense автоматически завершил метод. Обратите внимание на то, что у вас есть выбор поместить код до или после вызова base.OnLoad (), именно так вы контролируете, кто является боссом. Вы - босс, когда ставите это после, кстати, не всегда правильный выбор.

76
ответ дан 7 November 2019 в 07:24
поделиться

Ознакомьтесь с Использование конструктора в Windows Forms для обеспечения правильной инициализации

Использование конструктора в форме Windows для обеспечения правильности инициализации . Порядок запуска событий не является точной наукой, и вы не можете всегда зависеть от порядка, в котором запускаются события, независимо от того, что вы видели в мимо.

....

По этой причине Microsoft рекомендует обрабатывать код инициализации в конструкторе форм , предполагая, что вы не иметь действительно трудоемкую инициализацию, которая могла бы получить временные интервалы или вызвать DoEvents ().

11
ответ дан 7 November 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: