2009-02-04 3 views
8

2 개의 양식을 사용하여 필요한 모든 컨트롤을 표시하는 winforms 응용 프로그램이 있습니다. 응용 프로그램이 내가 숨길 수 SplashForm를 원하거나 나를 보내로드가 완료되면C# winforms 시작 (스플래시) 양식이 숨어 있지 않습니다.

Application.Run(new SplashForm()); 

: 첫 번째 양식은 그것이 그래서 나는 다음과 같은 코드를 사용하고 등로드 IT 사용자를 알 수있는 시작 화면입니다 뒤와 주된 것을 보여줄 수 있습니다.

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

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

은 내가보고하고하는 것은 MainForm이 표시되어 있는지,하지만 SplashForm은 여전히 ​​'위에'볼 수 있습니다 : 저는 현재 다음 사용하고 있습니다. 현재 내가하고있는 것은 수동으로 MainForm을 클릭하여 앞으로 가져 오는 것입니다. 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까?

답변

20

아마도 스플래시 양식을 닫고 다시 보내지 않을 것입니다.

내가 별도의 스레드에서 시작 폼을 실행 (이 클래스 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(); 
    } 
... 
} 

및 주요 프로그램 기능은 다음과 같습니다

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

SplashForm이 WPF 창인 경우이 메서드는 작동하지 않습니다. – MrEdmundo

+1

WinForms에만 사용합니다. 죄송합니다. – Grzenio

+0

클래스에 "frmSplash splashForm"과 같은 변수를 정의했지만 정의 된 변수에 대해 "비 정적 필드, 메서드 또는 속성에 대한 개체 참조가 필요합니다."와 같은 오류가 발생합니다. 수업에서 어떻게 사용할 수 있습니까? – Sadegh

2

내가 제대로 이해 한 경우 귀하의 메인 폼에 Application.Run을 사용해야합니다. 따라서 먼저 다음과 같이 사용하여 스플래시를 표시하십시오.

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

그런 다음 언제든지 MySplash에서 수동으로 닫으십시오.

로드 폼을로드 한 다음 Load 메서드가 완료 될 때까지 닫거나 기다릴 때까지 기다립니다. 당신이 나중에 다시 true로 보여 전에 (아마 false로 보이는 설정.

1

나는 내 현재 디자인에서 설계 결함이 될 수 있다고 생각!

내가 가장 좋은 방법은 내가하는 것입니다 필요 달성하기 위해 생각 . MainForm에서 controled 모든 것을 가지고 그래서 내가 사용할 수 있습니다

Application.Run(new MainForm()); 

이 다음/표시/업데이트에 대한 responsable 수 SplashScreen로 숨어있는 것이다이 방법을 내가 관리하는 시스템의 나머지 부분과 필요한 복잡한 intactions을 가질 수 있습니다. MainForm.

4

이것은 초점을 훔치는하고 종료 후 배경에 기본 양식을 밀고에서 스플래시 화면을 방지하기 위해 매우 중요하다 :

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

당신이 추가 양식 클래스를 시작합니다.

+0

이 유용한 정보를 공유해 주셔서 감사합니다 :) – hima

관련 문제