Какая разница между Application.Run() и Form.ShowDialog()?

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

var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
    Application.Run(new MainForm());

Но потом я начал задаваться вопросом - какая точка Application.Run()? Почему бы просто не сделать (new MainForm()).ShowDialog()? Какая разница? И какой был бы правильный способ добиться того, чего я хочу?

Ответ 1

Application.Run(Form) запускает цикл сообщения в текущем потоке и отображает указанную форму. Цикл сообщения позволяет формам получать сообщения Windows (например, нажатия клавиш, щелчки мыши, кражи недействительности), чтобы он мог реагировать и взаимодействовать с пользователем. Когда вы вызываете ShowDialog() на экземпляр Form, он фактически делает аналогичную вещь и создает цикл модального сообщения для формы, на которой был вызван ShowDialog.

Между двумя вызовами нет большой разницы. Application.Run добавляет некоторую дополнительную обработку событий, позволяющую вам делать некоторую очистку ресурсов при закрытии основной формы (см. Application.ThreadExit).

Рекомендуемый способ запуска приложений WinForms - использовать Application.Run, но я подозреваю, что это скорее соглашение, чем правило. Самая большая причина использовать Application.Run - это если вы хотите открыть несколько немодальных форм. Вы можете сделать это, используя:

new Form().Show();
new Form().Show();
Application.Run();

Вы не могли достичь этого, используя метод ShowDialog(), поскольку одна из форм должна быть модальной.


Что касается вашего вопроса о том, как показать форму входа, а затем основную форму, если вход в систему будет успешным, я думаю, что у вас все хорошо:

if (new LoginForm().ShowDialog() == DialogResult.OK)
{
    Application.Run(new MainForm());
}

Альтернативой является сделать санинг самостоятельно и открыть экземпляр MainForm в событии закрытия LoginForm, если логин был успешным.

Ответ 2

Из моего тестирования я заметил это основное различие:

Когда используется Application.Run, кнопка закрытия формы (красный X) возвращает DialogResult.None; однако, когда используется ShowDialog, кнопка Close вызывает DialogResult.Cancel.

Это для вас? В моем коде я тестировал DialogResult.Cancel, чтобы определить код выхода моего приложения. Это было нарушено, когда красный X использовался для закрытия формы. Теперь я тестирую DialogResult.OK, чтобы указать успешный выход.

        return myForm.DialogResult == DialogResult.OK ? 0 : 1;

Ответ 3

Из MSDN:

Этот метод добавляет обработчик события к параметр mainForm для закрытого мероприятие. Вызов обработчика событий ExitThread для очистки приложение.

http://msdn.microsoft.com/en-us/library/ms157902.aspx

Ответ 4

Одно из ключевых отличий заключается в том, что ShowDialog обычно является модальным диалогом. Если вы хотите создать удобный набор инструментов, вы бы не хотели, чтобы он состоял из модальных диалоговых окон.

Кроме того, Application.Run() принимает больше, чем просто форму. Он имеет несколько перегрузок.

Что касается вашего приложения, я не думаю, что это имеет большое значение. Application.Run имеет смысл для меня, потому что это означает начало вашего фактического Приложения.

Ответ 5

документация о перегрузке

public static void Run(
    ApplicationContext context );

имеет аккуратный пример с другим подходом, который также включает две формы.

Ответ 6

Для более конкретируемого примера разницы:

Если ваша основная форма - форма MDI, поведение при нажатии кнопки закрытия ( "x" в правом верхнем углу или Alt-F4) различается в зависимости от того, какой метод вы используете для отображения формы.

С Application.Run(mainForm) запускается событие закрытия дочерних форм, затем запускается событие закрытия основной формы.

С mainForm.ShowDialog запускается событие закрытия основной формы, а событие закрытия дочерних форм не выполняется.

Ответ 7

Application.Run() предназначен для начала приложения, а MainForm является частью приложения, а MainForm()).ShowDialog() используется только для его отображения.

Application.Run() - это entry point для вашего приложения. то же, что и метод Main() для некоторого класса или ApplicationStart() для WebApplication

Application.Run() имеет разные перегрузки, один из которых не имеет параметров. Этот метод запускает приложение без начальной формы.

Ответ 8

Из моего тестирования я замечаю, что использование кнопок Application.Run с DialogResult не закрывает форму (OnFormClosing не попадает) сравнивается с ShowDialog, в котором кнопки с DialogResult ударяют OnFormClosing и закрывают форму.