2009-02-04 60 views
8

Tengo una aplicación de winforms en la que estoy usando 2 formularios para mostrar todos los controles necesarios. La primera forma es una pantalla de bienvenida en la que le dice al usuario que la carga de TI, etc Así que estoy usando el siguiente código:Formulario de inicio de Winforms de C# (Splash) no oculto

Application.Run(new SplashForm()); 

vez que la aplicación ha terminado de cargarse Quiero que el SplashForm para ocultar o me envió a la parte posterior y la principal de que se mostrará. Actualmente estoy usando el siguiente:

private void showMainForm() 
{ 
    this.Hide(); 
    this.SendToBack(); 

    // Show the GUI 
    mainForm.Show(); 
    mainForm.BringToFront(); 
} 

Lo que estoy viendo es que se muestra la MainForm, pero el SplashForm es aún visible 'en la parte superior'. Lo que estoy haciendo actualmente es hacer clic en MainForm para llevarlo al frente manualmente. ¿Alguna idea de por qué esto esta pasando?

Respuesta

20

Probablemente solo quiera cerrar el formulario de bienvenida y no enviarlo a la parte posterior.

corro el formulario de inicio en un hilo separado (esto es SplashForm clase):

class SplashForm 
{ 
    //Delegate for cross thread call to close 
    private delegate void CloseDelegate(); 

    //The type of form to be displayed as the splash screen. 
    private static SplashForm splashForm; 

    static public void ShowSplashScreen() 
    { 
     // Make sure it is only launched once. 

     if (splashForm != null) 
      return; 
     Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm)); 
     thread.IsBackground = true; 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start();   
    } 

    static private void ShowForm() 
    { 
     splashForm = new SplashForm(); 
     Application.Run(splashForm); 
    } 

    static public void CloseForm() 
    { 
     splashForm.Invoke(new CloseDelegate(SplashForm.CloseFormInternal)); 
    } 

    static private void CloseFormInternal() 
    { 
     splashForm.Close(); 
    } 
... 
} 

y la función principal del programa es similar a esto:

[STAThread] 
static void Main(string[] args) 
{ 
    SplashForm.ShowSplashScreen(); 
    MainForm mainForm = new MainForm(); //this takes ages 
    SplashForm.CloseForm(); 
    Application.Run(mainForm); 
} 
+0

Este método no funciona si SplashForm es una ventana de WPF – MrEdmundo

+1

Lo uso solo para WinForms, lo siento. – Grzenio

+0

Definí una variable como "frmSplash splashForm" en su clase, pero recibo algunos errores como "Se requiere una referencia de objeto para el campo, método o propiedad no estáticos" para la variable definida. ¿Cómo puedo usar tu clase? – Sadegh

2

Si he entendido correctamente, debería simplemente usar Application.Run en su formulario principal. Así que muestran ya sea su primera salpicaduras simplemente mediante el uso de algo como:

using(MySplash form = new MySplash()) 
    form.ShowDialog(); 

Y luego cerrarlo manualmente en MySplash cada vez que desee.

O muéstrela en sus formularios principales Cargue el controlador de eventos y espere a que se cierre o lo que sea hasta que finalice el método de carga. (Posiblemente el establecimiento visible en false antes de mostrar y volver a la verdadera después.

1

creo que podría ser un defecto de diseño en mi diseño actual!

Creo que la mejor manera de lograr lo que necesito es a . tener todo controlado desde el MainForm Así que puedo utilizar:

Application.Run(new MainForm()); 

Esto entonces será responsable por mostrar/actualizar/ocultar la SplashScreen de esta manera puedo tener las intactions complejas necesarias con el resto del sistema gestionado por. MainForm.

4

Esto es crucial para evitar que la pantalla de bienvenida de robar su enfoque y empujando su forma principal a un segundo plano después de que se cierra:

protected override bool ShowWithoutActivation { 
    get { return true; } 
} 

añadir esto a salpicar clase de formulario.

+0

Gracias por compartir esta información útil :) – hima

Cuestiones relacionadas