2010-02-22 18 views
62

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:¿Cuál es la diferencia entre Application.Run() y Form.ShowDialog()?

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

Pero entonces me empecé a preguntar - ¿cuál es el punto 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?

Respuesta

54

Application.Run(Form) inicia un ciclo de mensajes 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 al ShowDialog() en una instancia Form, realmente hace algo similar y crea un bucle de mensaje modal para el formulario en el que se ha llamado ShowDialog.

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

La forma recomendada para iniciar aplicaciones WinForms es usando 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. Esto se puede hacer usando:

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

No se podía lograr esto usando el método ShowDialog() como una de las formas tendría que ser modal.


cuanto a su pregunta de cómo mostrar un formulario de acceso y luego la forma principal si el inicio de sesión se realiza correctamente, creo que lo que tienes es fina:

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

La alternativa es hacer la fondear usted mismo y abrir una instancia de MainForm en el evento de cierre de LoginForm si el inicio de sesión fue exitoso.

+0

Entonces, ¿esto significa que puede tener un bucle de mensaje en el mismo hilo que los dos formularios mientras puede manejar los tres por separado? – SomeNickName

1

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

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

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

+1

Entonces, ¿qué significa todo eso en términos de cuál debería elegir? Hasta ahora, me parece que ambas formas funcionan bien. Pero debe haber algunas diferencias sutiles, ¿verdad? –

4

De MSDN:

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

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

+5

¿Es esa la única diferencia notable? Comprobé con el reflector y parece que hay mucho más detrás de las escenas dependiendo de cuál se llame. Definitivamente hay algunas diferencias más sutiles, aunque no puedo decir qué, el código reflejado es bastante críptico. –

+0

Acabo de encontrar uno loco, y llegué aquí mientras buscaba en Google para ver si alguien podía explicar por qué: Pasé como una hora en el trabajo hoy tratando de descubrir por qué esto. Ocultar(), y esto. Visible = falso, en mi forma, ambos en realidad cerraron la forma en lugar de ocultarla. Estaba totalmente desconcertado. Aparentemente hay alguna diferencia, ¡totalmente reproducible! - donde form.ShowDialog() hace esto, pero Application.Run() hace lo esperado. ¿Qué pasa con eso? (Supongo que la idea es, porque es modal, si alguna vez no se muestra, se supone que desea cerrarlo). – neminem

2

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.

+0

Dado que es mi forma principal, no importa si se trata de un cuadro de diálogo modal, ¿no? –

+0

Eso es correcto. –

5

De mis pruebas, me di cuenta de esta diferencia principal:

Cuando se utiliza Application.Run, el botón Cerrar de la forma (X roja) devuelve DialogResult.None; sin embargo, cuando se usa ShowDialog, el botón Cerrar produce DialogResult.Cancel.

¿Le importa a usted? 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; 
+0

Esto se debe a que Application.Run usa el Formulario.Show() –

2

El documentation of the overload

public static void Run(
    ApplicationContext context); 

tiene un claro ejemplo con un enfoque diferente que implica dos formas también.

+1

Buen consejo. Desafortunadamente no me ayudó cuando uso WinCE. – Oren

2

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 parte superior derecha, o Alt-F4) es diferente según el método que use para mostrar el formulario.

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

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

0

De mi prueba observo que usar los botones Application.Run con DialogResult no cierra el formulario (OnFormClosing no se activa) comparar con ShowDialog en el que los botones con DialogResult presionan OnFormClosing y cierran el formulario.

Cuestiones relacionadas