2011-09-10 66 views
4

我開發了一個應用程序,我在其中使用Windows窗體作爲啓動畫面。在顯示啓動畫面後,我創建了一個新線程來觸發新窗體。現在我想在我的表單顯示後關閉啓動畫面。從另一個'表單'關閉'表單'

我GOOGLE了我的查詢,許多討論,但無法找到我想要的。

請引導我一點。

謝謝。

+1

使用計時器是不適合我的。 –

+1

爲什麼不同線程上的窗體? – CodesInChaos

+2

在.NET中使用內置支持啓動屏幕,獲得線程權限是非常平凡的:http://stackoverflow.com/questions/392864/c-splash-screen-problem/393870#393870 –

回答

1

通常你並不需要一個新的線程。但是一旦你擁有了它,你可以通過在兩個線程之間共享一個bool值(命名爲closeSplash)來完成它。

在啓動窗體上放置一個計時器,以檢查closeSplash每秒的值。當closeSplash爲true時,只需調用Splash窗體的Close()方法即可。

請參閱this如果您選擇關閉另一個線程的啓動畫面。

+0

我解決了我的問題。 感謝大家! –

+0

@Muhammad Ali Dildar你是如何解決它的?有沒有答案提供解決方案?如果是這樣,請將該答案標記爲解決方案。 – Adi

3

只要您對第一種形式有一些參考,就可以在另一種形式上調用Close()方法。所以當你創建第二個表單時,請給它啓動畫面的引用。然後將一個處理程序附加到顯示事件並在啓動屏幕上調用close。

爲了解決交叉線程問題,您需要創建一個名爲ThreadSafeClose的方法,並將其定義如下。然後調用該方法,而不是.Close()

public void ThreadSafeClose() { 
     if(this.InvokeRequired) { 
      this.Invoke(new MethodInvoker(this.Close)); 
     } 
    } 
+2

表單處於不同的線程。你不能從另一個線程調用一個控件的方法。您需要使用Invoke()從spash的線程運行Close()。 – Adi

0

我有一個哈克方法我用..也許不是,雖然做的最好的事情。在閃屏形式中的 聲明自己的靜態實例。

public static SplashForm splashInstance; 

然後在splashform的構造函數中,您可以指定一個值「this」。

SplashForm.splashInstance = this; 

您現在可以從應用程序中的任何位置調用SplashForm.splashInstance.Close()。

+0

小心:直接從另一個線程調用Close()是無效的。您需要切換到splash的表單線程上下文才能運行代碼。 – Adi

+0

我在加載表單時調用它,但沒有工作。 –

+0

@Muhammad Ali Dildar請看我上面的答案,有一個鏈接到一個可能有幫助的thead。我個人儘量避免將UI消息從一個線程發送到另一個線程。相反,嘗試使用一些共享成員/屬性向另一個線程發出信號,表明您希望UI執行某些操作。 – Adi

3

爲了關閉表單,您需要鏈接到此表單。最簡單的方法是將程序中的新屬性添加到程序中的靜態且可用的對象中。只需修改Program.cs文件,以使Program類公衆,並添加適當的參考:

public static class Program 
{ 
    ///This is your splash screen 
    public static Form1 MySplashScreen = new Form1(); 

    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     /// This is how you run your main form 
     Application.Run(MySplashScreen); 
    } 
} 

然後在你的表格,你可以很容易地使用以下語法關閉閃屏的形式:

Program.MySplashScreen.Close(); 

編輯:在WinForms中只有一個GUI線程,所以只要您從另一個窗體中執行關閉,它應該是安全的。如果您想從從GUI催生了一個工作線程關閉窗體,使用下面的代碼(這應該引用您的第二種形式則):

this.Invoke((MethodInvoker)delegate { 
      Program.MySplashScreen.Close(); 
}); 
0

你做不是需要一個單獨的線程來顯示一段時間內的「閃屏」。事實上,有更好的方法可以設計你的課程,使得這一切都變得容易完成。這裏沒有使用計時器或使用單獨的線程這不是正確的解決方案恕我直言。我建議你嘗試做這樣的事情:

public class SplashScreen : Form 
{ 
    // add a timer to your form with desired interval to show 

    protected override void OnShown(EventArgs e) 
    { 
     displayTimer.Start(); 
     base.OnShown(e); 
    } 

    private void displayTimer_Tick(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

public class MainForm : Form 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     // splash screen will be shown before your main form tries to show itself 
     using (var splash = new SplashScreen()) 
      splash.ShowDialog(); 
     base.OnLoad(e); 
    } 
} 
相關問題