2009-02-04 4 views
8

Mam aplikację WinForm, w której używam 2 formularzy do wyświetlania wszystkich niezbędnych kontrolek. Pierwsza forma jest ekran powitalny, w którym informuje użytkownika, że ​​to ona ładowanie itd. Więc używam następujący kod:Formularz C# winforms startup (Splash) nie ukrywający się

Application.Run(new SplashForm()); 

Gdy aplikacja zakończy ładowanie chcę SplashForm ukryć lub wysłane do mnie z tyłu i z głównego pokazu. Obecnie używam następujących:

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

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

co widzę jest to, że MainForm jest pokazany, ale SplashForm jest nadal widoczny „na górze”. Obecnie robię to klikając na MainForm, aby ręcznie przenieść go na wierzch. Jakieś pomysły na to, dlaczego tak się dzieje?

Odpowiedz

20

Prawdopodobnie chcesz tylko zamknąć formularz powitalny i nie wysyłać go z powrotem.

uruchomić formularz powitalny na osobnym wątku (jest to klasa 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(); 
    } 
... 
} 

i główną funkcją programu wygląda następująco:

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

Ta metoda nie działa, jeśli SplashForm jest oknem WPF. – MrEdmundo

+1

Używam go tylko dla WinForm, przepraszam. – Grzenio

+0

Zdefiniowałem zmienną taką jak "frmSplash splashForm" w twojej klasie, ale dostaję kilka błędów takich jak "Odniesienie do obiektu jest wymagane dla niestatycznego pola, metody lub właściwości" dla zdefiniowanej zmiennej. Jak mogę korzystać z zajęć? – Sadegh

2

Jeśli dobrze zrozumiałem, ty powinien po prostu użyć Application.Run na swoim głównym formularzu. Więc albo pokaż swój splash najpierw, używając czegoś takiego:

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

A następnie zamknij go ręcznie w MySplash, kiedy tylko chcesz.

Lub pokaż go w swoich głównych formularzach Załaduj program obsługi zdarzeń, a następnie poczekaj na jego zamknięcie lub cokolwiek, aż do zakończenia metody ładowania. (Ewentualnie ustawienie Visible na false przed pokazać go iz powrotem na true potem.

1

Wierzę, że może to być wada projektu w moim obecnym projekcie!

Myślę, że najlepszym sposobem na osiągnięcie tego, co jest mi potrzebne do . mają wszystko sterowane z MainForm Więc mogę używać:

Application.Run(new MainForm()); 

To będzie wtedy odpowiedzialni za pokazywanie/aktualizacji/ukrywanie ekran powitalny w ten sposób mogę mieć niezbędne złożonych intactions z resztą systemu zarządzanego przez. MainForm:

4

Jest to istotne, aby zapobiec ekran powitalny od kradzieży ostrość i pcha swoją główną postać w tle po zamknięciu:

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

Dodaj to do was wodą Klasa formularza.

+0

Dziękujemy za udostępnienie tych przydatnych informacji :) – hima