2009-02-04 13 views
8

Ho un'applicazione WinForms in cui sto usando 2 moduli per visualizzare tutti i controlli necessari. La prima forma è una schermata iniziale in cui si indica all'utente che esso si carica ecc Quindi io sto usando il seguente codice:C# WinForms avvio (Splash) forma non nascondendo

Application.Run(new SplashForm()); 

Una volta che l'applicazione ha completato il caricamento Voglio che lo SplashForm per nascondere o mi ha mandato a la parte posteriore e il principale da mostrare. Attualmente sto usando il seguente:

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

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

quello che sto vedendo è che il MainForm viene mostrato, ma lo SplashForm è ancora visibile 'in alto'. Quello che sto facendo attualmente è cliccando sul MainForm per portare manualmente in primo piano. Qualche idea sul perché questo sta accadendo?

risposta

20

Probabilmente si vuole solo chiudere il modulo iniziale, e non inviarlo a tornare.

ho eseguito il modulo spruzzata su un thread separato (questo è di classe SplashForm):

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(); 
    } 
... 
} 

e la funzione principale del programma si presenta così:

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

Questo metodo non funziona se lo SplashForm è una finestra WPF – MrEdmundo

+1

lo uso solo per WinForms, mi dispiace. – Grzenio

+0

Ho definito una variabile come "frmSplash splashForm" nella tua classe, ma ottengo alcuni errori come "Un riferimento a un oggetto è richiesto per il campo, il metodo o la proprietà non statici" per la variabile definita. come posso usare dalla tua classe? – Sadegh

2

Se ho capito bene, si dovrebbe solo usare Application.Run sul tuo modulo principale. Così mostrare sia il vostro schizzi prima semplicemente utilizzando qualcosa di simile:

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

E poi chiuderlo manualmente MySplash ogni volta che si desidera.

o mostrare nel vostro gestore di eventi Load forme principale e poi aspettare che si chiude o qualsiasi altra cosa fino a quando si lascia il metodo Load completa. (Probabilmente l'impostazione Visibile su false prima di mostrare e di nuovo su true dopo.

1

Credo che potrebbe essere un difetto di progettazione nel mio progetto attuale!

Penso che il miglior modo per ottenere quello che mi serve è quello di . avere tutto controllato dal MainForm modo da poter utilizzare:

Application.Run(new MainForm()); 

Questo sarà poi responsabile per mostrare/aggiornamento/nascondere la SplashScreen in questo modo posso avere le necessarie intactions complessi con il resto del sistema gestito da. il MainForm.

4

Questo è fondamentale per evitare che la schermata iniziale di rubare la vostra attenzione e spingere il modulo principale per lo sfondo dopo si chiude:

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

Aggiungi questo a voi schizzare classe form.

+0

Grazie per aver condiviso queste informazioni utili :) – hima