¿Cuál es la diferencia entre Application.Run () y Form.ShowDialog ()?

En mi aplicación, primero quiero mostrar un formulario de inicio de sesión y luego el formulario principal si el inicio de sesión ha sido exitoso. Actualmente lo estoy haciendo algo como esto:

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

Pero luego comencé a preguntarme: ¿cuál es el objective de la Application.Run() ? ¿Por qué no simplemente hacer (new MainForm()).ShowDialog() también? ¿Cual es la diferencia? ¿Y cuál sería la forma correcta de lograr lo que quiero?

Application.Run(Form) inicia un bucle de mensaje en el hilo actual y muestra el formulario especificado. El bucle de mensajes permite que el formulario reciba mensajes de Windows (p. Ej., Pulsación de teclas, clics del mouse, invalidación de pintura) para permitir que aparezca receptivo y tenga interacción con el usuario. Cuando llama a ShowDialog() en una instancia de Form , realmente hace algo similar y crea un bucle de mensaje modal para el formulario en el que se ha llamado a ShowDialog .

No hay mucha diferencia entre las dos llamadas. Application.Run agrega algo de manejo de eventos adicionales que le permite hacer algunos arreglos de recursos cuando se cierra el formulario principal (consulte Application.ThreadExit ).

La forma recomendada de iniciar aplicaciones WinForms es utilizando Application.Run , pero sospecho que esto es más una convención que una regla. La razón más importante para usar Application.Run es si desea abrir múltiples formularios no modales. Puedes hacer esto usando:

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

No podría lograr esto utilizando el método ShowDialog() ya que uno de los formularios debería ser modal.


En cuanto a su pregunta de cómo mostrar un formulario de inicio de sesión y luego el formulario principal si el inicio de sesión es exitoso, creo que lo que tiene está bien:

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

La alternativa es hacer las cañerías usted mismo y abrir una instancia de MainForm en el evento de cierre de LoginForm si el inicio de sesión fue exitoso.

De mi prueba, noté esta diferencia principal:

Cuando se utiliza Application.Run, el botón Cerrar del formulario (X rojo) devuelve DialogResult.None; sin embargo, cuando se usa ShowDialog, el botón Cerrar produce DialogResult.Cancel.

¿Esto te importa? En mi código, estaba probando DialogResult.Cancel para determinar el código de salida de mi aplicación. Eso se rompió cuando se usó la X roja para cerrar el formulario. Ahora pruebo DialogResult.OK para indicar una salida exitosa.

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

Desde MSDN:

Este método agrega un controlador de eventos al parámetro mainForm para el evento cerrado. El controlador de eventos llama a ExitThread para limpiar la aplicación.

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

Una diferencia clave es que ShowDialog suele ser un cuadro de diálogo modal. Si desea crear un conjunto de herramientas fácil de usar, no le gustaría que esté compuesto de cuadros de diálogo modales.

Además, Application.Run () acepta más que solo un formulario. Tiene algunas sobrecargas.

En cuanto a su aplicación, no creo que importe mucho. Application.Run tiene sentido para mí porque denota el inicio de su aplicación real.

La documentación de la sobrecarga

 public static void Run( ApplicationContext context ); 

tiene un buen ejemplo con un enfoque diferente que también involucra dos formas.

Para un ejemplo más concerete de una diferencia:

Si su formulario principal es un formulario MDI, entonces el comportamiento al hacer clic en el botón Cerrar (la ‘x’ en la esquina superior derecha, o Alt-F4) es diferente dependiendo del método que use para mostrar el formulario.

Con Application.Run(mainForm) , se Application.Run(mainForm) el evento de cierre de los formularios secundarios, luego se ejecuta el evento de cierre del formulario principal.

Con mainForm.ShowDialog , se mainForm.ShowDialog el evento de cierre del formulario principal y el evento de cierre de los formularios secundarios no se ejecuta.

Application.Run() es para el inicio de la aplicación mientras MainForm es parte de la aplicación y MainForm()).ShowDialog() usa para mostrarlo solo.

Application.Run() es el entry point para su Aplicación. lo mismo que el método Main() es para alguna clase o ApplicationStart() para una aplicación web

Application.Run () tiene diferentes sobrecargas, una de las cuales no tiene parámetros. Ese método inicia la aplicación sin una forma inicial.

De mi prueba noté que usar los botones Application.Run con DialogResult no cierra el formulario (OnFormClosing no se acelera) compare con ShowDialog en el que los botones con DialogResult presionan OnFormClosing y cierran el formulario.