2013-04-05 8 views
9

Vorrei chiedere come creare una schermata di caricamento (solo un'immagine o qualcosa) visualizzata durante il caricamento del programma e scompare al termine del caricamento del programma.C# WinForm - schermata di caricamento

nelle versioni più elaborate, ho visto la barra del processo (%) visualizzata. come puoi averlo e come calcoli la% da mostrare su di essa?

So che c'è un evento Form_Load(), ma non vedo un evento Form_Loaded() o il% come una proprietà/attributo ovunque.

+0

Cosa carica il modulo? Avete delle operazioni di interrogazione del database, operazioni cpu-intensive, qualcosa di veramente necessario per mostrare una "barra di avanzamento" o volete solo una schermata iniziale? –

+0

Voglio una schermata iniziale, ma voglio anche conoscere la barra di avanzamento. – CaTx

risposta

26

tutto ciò che serve per creare un modulo come schermata iniziale e mostrarlo prima di iniziare a mostrare la pagina di destinazione e chiudere questo splash una volta caricata la pagina di destinazione.

using System.Threading; 
using System.Windows.Forms; 

namespace MyTools 
{ 
    public class SplashForm : Form 
    { 
     //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(); 
      splashForm = null; 
     } 
    } 
} 

e la funzione principale del programma è simile al seguente:

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

Posso usare questo codice per chiamare un modulo grande e lento da un altro modulo? Come un 'Login -> Schermata principale'? –

+0

il tuo schermo principale è il punto di partenza per il tuo processo di programmazione. quindi hai bisogno di un'istanza viva di main, quindi puoi. – JSJ

+0

Grazie! Questo è stato un grande tutorial! – tkrn

1

Se avete intenzione di mostrare la SplashForm più di una volta nella propria applicazione, assicurarsi di impostare la variabile splashForm a null altrimenti si riceverai un errore

static private void CloseFormInternal() 
{ 
    splashForm.Close(); 
    splashForm = null; 
} 
+0

Modifica la risposta del codice. Grazie. – Pedro77