Какой установочный код должен идти в конструкторах форм по сравнению с событием загрузки формы? - PullRequest
55 голосов
/ 26 марта 2010

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

  • MainForm ()

вместо

  • MainForm_Load (отправитель объекта, EventArgs e)

Есть ли здесь рекомендации по передовому опыту?

Ответы [ 2 ]

72 голосов
/ 26 марта 2010

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

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

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

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

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

10 голосов
/ 26 марта 2010

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

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

....

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

...