2009-02-04 5 views
8

J'ai une application winforms dans laquelle j'utilise 2 Forms pour afficher tous les contrôles nécessaires. La première forme est un écran d'accueil dans lequel il indique à l'utilisateur qu'il le chargement, etc. Je suis en utilisant le code suivant:Formulaire de démarrage de Winforms C# (Splash) ne se cache pas

Application.Run(new SplashForm()); 

Une fois l'application terminée le chargement, je veux que le SplashForm cacher ou m'a envoyé le dos et le principal d'être montrer. J'utilise actuellement les éléments suivants:

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

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

Ce que je vois est que le MainForm est affiché, mais le SplashForm est toujours visible sur le dessus. Ce que je suis en train de faire est de cliquer sur MainForm pour l'amener manuellement à l'avant. Des idées sur pourquoi cela se passe-t-il?

Répondre

20

Probablement vous voulez juste fermer le formulaire splash, et ne pas l'envoyer à l'arrière.

Je cours sous forme de démarrage sur un thread séparé (ce qui est 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(); 
    } 
... 
} 

et la fonction principale du programme ressemble à ceci:

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

Cette méthode ne fonctionne pas si le SplashForm est une fenêtre WPF – MrEdmundo

+1

Je l'utilise uniquement pour WinForms, désolé. – Grzenio

+0

J'ai défini une variable comme "frmSplash splashForm" dans votre classe mais j'ai quelques erreurs comme "Une référence d'objet est requise pour le champ, la méthode ou la propriété non-statique" pour la variable définie. comment puis-je utiliser de votre classe? – Sadegh

2

Si je comprends bien, vous devrait juste utiliser Application.Run sur votre formulaire principal. Donc, soit montrer votre premier démarrage en utilisant simplement quelque chose comme:

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

Et puis fermez manuellement dans MySplash chaque fois que vous voulez.

Ou affichez-le dans vos formulaires principaux Chargez le gestionnaire d'événements, puis attendez qu'il se ferme ou quoi que ce soit jusqu'à ce que vous quittiez la méthode Load. (Réglage Peut-être visible à false avant de le montrer et de retour à vrai par la suite.

1

Je crois qu'il pourrait être un défaut de conception dans ma conception actuelle!

Je pense que la meilleure façon d'atteindre ce que je dois est . ont tout controlée du MainForm Je peux utiliser:

Application.Run(new MainForm()); 

Ce sera ensuite responsable pour montrer/mise à jour/cacher la SplashScreen de cette façon, je peux avoir les intactions complexes nécessaires avec le reste du système géré par. le MainForm

4

Ceci est crucial pour éviter que votre écran de démarrage de voler votre foyer et pousser votre principale forme à l'arrière-plan après sa fermeture:

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

Ajouter ce pour vous éclabousser la classe de formulaire.

+0

Merci de partager cette information utile :) – hima

Questions connexes