2010-01-15 3 views

ответ

5

Form.Shown event - хорошее место для любой инициализации, которая может занять более одной секунды. Form.Shown происходит только один раз, только после форма сначала становится видимой для пользователя.

Очевидно, что если у вас есть длительная инициализация, вам все равно нужно предоставить какую-то визуальную обратную связь и, возможно, отключить разделы формы до завершения. Но если инициализация неизбежна, Form.Shown по крайней мере позволяет вам сообщить, что приложение не заморожено и дает отзыв о том, что он на самом деле делает.

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

По сравнению с Form.Activated: Вам не нужно беспокоиться о своей инициализации выполняется несколько раз, потому что Активированное событие вызывается каждый раз, когда ваша форма скрыта/показано, минимизировано/максимальна и т.д.

По сравнению с constructor: Аналогично Form.Load ваша форма не будет видна до завершения инициализации. Кроме того, вы должны быть более осторожны в вопросах времени и последовательности, связанных с элементами управления, которые могут быть не полностью инициализированы.

+0

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

1

Выполнение работ в событии «Загрузка» сделает исключения, если это не так легко читать, и ИМХО является семантически более чистым. Практически, это не делает тонны разницы.

4

Для более тяжелой инициализации это обычно выполняется в событии загрузки. Конструкторы обычно используются для быстрой и простой инициализации полей. Если вам нужно сделать вызов метода внешней зависимости, например, вы должны сделать это от загрузки.

2

Это зависит от типа инициализации. Простая инициализация поля, например, может быть выполнена в конструкторе, и это избавляет вас от необходимости подключать событие, иметь дополнительный метод и т. Д.

Однако в некоторых случаях у конструктора нет информации о вас необходимость. Например, если вы хотите делать разные вещи в зависимости от того, находитесь ли вы в режиме разработки или режиме выполнения (например, в режиме запуска вы подключаетесь к источнику данных, но в режиме проектирования вы хотите отображать данные образца), тогда это должно отложить до тех пор, пока конструкция не будет создана, поскольку структура не устанавливает DesignMode до тех пор, пока объект не будет создан.

+0

Неправда на самом деле. Вы можете проверить LicenseManager.UsageMode в конструкторе (и * только * в конструкторе), чтобы проверить, находитесь ли вы в режиме разработки. – Eric

3

Более тяжелая инициализация также не может быть хорошей идеей при загрузке, так как это может увеличить время загрузки и может вызвать раздражение у конечного пользователя. Я предпочитаю делать базовую инициализацию (скажем, которая принимает < 10 секунд) в Форме Load и делает остальную тяжелую работу после того, как она отображается пользователю. Чтобы пользователь мог ждать, индикатор прогресса может быть отображен.

0

Подумайте, что произойдет, если вы запустите Show или ShowDialog для той же формы дважды. Все вещи, которые не могут измениться между этими двумя вызовами, должны быть в конструкторе; весь код инициализации, в зависимости от соответствующего Вызов вызова (Dialog) должен быть в обработчике событий, который будет вызываться для каждого из этих вызовов. Например, владелец формы передается в ShowDialog, а не в конструкторе, и может быть разным для двух разных вызовов ShowDialog, поэтому все, что зависит от владельца, не должно находиться в конструкторе.

Смежные вопросы