В чем разница между Application.Run () и Form.ShowDialog ()? - PullRequest
68 голосов
/ 23 февраля 2010

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

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

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

Ответы [ 8 ]

64 голосов
/ 23 февраля 2010

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, если вход был успешным.

5 голосов
/ 15 сентября 2011

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

При использовании Application.Run кнопка закрытия формы (красный X) возвращает DialogResult.None; однако при использовании ShowDialog кнопка «Закрыть» вызывает DialogResult.Cancel.

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

        return myForm.DialogResult == DialogResult.OK ? 0 : 1;
5 голосов
/ 23 февраля 2010

Из MSDN:

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

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

2 голосов
/ 10 января 2013

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

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

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

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

2 голосов
/ 30 мая 2012

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

public static void Run(
    ApplicationContext context );

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

2 голосов
/ 23 февраля 2010

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

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

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

1 голос
/ 23 февраля 2010

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

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

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

0 голосов
/ 01 ноября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...