2009-07-15 96 views
1

我很困惑如何使窗體可見。當我們創建Windows窗體應用程序時,即使沒有顯式調用Show方法,默認的Form1也會自動可見。但是,如果我們想顯示另一個窗體並使其可見,我們必須通過調用Show來使其可見。Windows窗體可見性問題

任何想法,爲什麼有這樣的差異?

我正在使用VSTS 2008 + C#+ .Net 2.0。

回答

2

這是因爲Form1將是應用程序的主要形式。具體而言,它將傳遞給Application.Run方法,該方法將創建一個ApplicationContext對象,並將Form1指定爲主窗體。當應用程序啓動時,它會檢查ApplicationContext是否具有主窗體,如果是,則該窗體的Visible屬性將設置爲true,這會導致窗體顯示。

或者,代碼表示,這是Application.Run

public static void Run(Form mainForm) 
{ 
    ThreadContext.FromCurrent().RunMessageLoop(-1, new ApplicationContext(mainForm)); 
} 

RunMessageLoop會調用另一個內部功能設置消息循環,並在該功能我們發現如下:

if (this.applicationContext.MainForm != null) 
{ 
    this.applicationContext.MainForm.Visible = true; 
} 

這是Form1顯示的內容。

這也給出瞭如何採取行動來防止Form1窗體在啓動時自動顯示的提示。所有我們需要做的是找到一種方法,而無需Form1的分配爲主要形式的ApplicationContext啓動應用程序:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    // create the form, but don't show it 
    Form1 form = new Form1(); 
    // create an application context, without a main form 
    ApplicationContext context = new ApplicationContext(); 
    // run the application 
    Application.Run(context); 
} 
4

看看VS爲您生成的文件「Program.cs」。

static class Program { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); // and especially this line :) 
    } 
} 
+0

嗨Stormenet,我沒有找到顯示從你引述的代碼調用。還有什麼提示? – George2 2009-07-15 07:11:26

+0

Application.Run將爲您調用Show。 基本上這條線告訴你的應用程序的初始表單是Form1。如果你想顯示另一個啓動表單,只需更改該行。 – Stormenet 2009-07-15 12:06:05

1

因爲form1是由Application.Run(new form1())調用的主要窗體;

您會在program.cs文件中找到此代碼,您可以更改爲任何形式。

+0

艾哈邁德,如果我新的另一種形式,並通過使用Form2 form2 = new Form2()構造它,form2永遠不會顯示。我認爲代碼與VSTS在Program.cs中爲我生成的代碼相同,我不知道Form2爲什麼不顯示? – George2 2009-07-15 07:19:41