2010-09-18 53 views
13

我遇到問題。我需要在窗口加載時隱藏我的窗口。但是this.Visible在Windows窗體中不起作用

private void Form1_Load(object sender, EventArgs e) 
    { 
     this.Visible = false; 
    } 

不起作用。而財產Visible仍然如此。我錯過了什麼嗎?

回答

30

是, Visible屬性在Windows窗體中是一個大問題,這就是實際得到的句柄創建並導致OnLoad()運行,換句話說,該窗口在它可見之前不存在,並且它將忽略嘗試撤銷該操作。

想要繼續創建句柄,但是如果使用NotifyIcon不會使窗口可見,這是很常見的。您可以通過覆蓋SetVisibleCore實現這一點:

protected override void SetVisibleCore(bool value) { 
     if (!this.IsHandleCreated) { 
      value = false; 
      CreateHandle(); 
     } 
     base.SetVisibleCore(value); 
    } 

當心的OnLoad仍然無法運行,直到窗口實際上變得可見,所以如果需要移動代碼到構造。只需在NotifyIcon的上下文菜單事件處理程序中調用Show()以使窗口可見即可。

-2

使用this.Hide()隱藏您的窗口。 this.Close()要關閉

+0

ok。但可見性有什麼問題? – Barun 2010-09-18 17:35:19

+1

this.Hide不會在_Load事件中工作 – 2010-09-18 17:36:49

1

我相信這是因爲該窗口直到此事件發生後才真正存在。要做到這一點,最好的地方就是形式外:

if (x == 1) 
{ 
    form1.ShowForm(); 
} 
else 
{ 
    // Don't show the form 
} 

如果你真的需要做的形式本身裏面,那麼我認爲你需要使用激活事件。

編輯:

您也可以嘗試這樣的:

static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Form1 myform = new Form1(); 
     if (myform.CheckStuff()) 
     { 
      Application.Run(myform); 
     } 
    } 
+0

我試過了。但在隱藏之前它出現然後消失。我不想要它。 – Barun 2010-09-18 17:36:55

+0

然後,我認爲在展示表格之前你必須做任何檢查。注意:即使這是您的主窗體,您也可以使用Main()函數來執行此檢查。 – 2010-09-18 17:40:58

+0

但是我需要隱藏和運行,並且在開始之前我無法做我的事情。 – Barun 2010-09-18 17:47:02

2

我想是不是設置從窗體的Load事件可視性好主意。相反,我會通過添加公共方法來實現:

public void LoadForm(...) 
{ 
    // do the all the initializations 
} 

並調用該方法來加載表單。該形式應該是不可見的,除非你明確地表現出來:

MyForm instance = new MyForm(); 
instance.LoadForm(...); 
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax. 
+0

但是,這是我的主要形式如何使用這種語法來控制它? – Barun 2010-09-18 17:45:18

4

看來你可以使用以下命令:

private void Form1_Load(object sender, EventArgs e) 
    { 
     this.Opacity = 0; 
     this.ShowInTaskbar = false; 
    } 

我只是測試它的WinForms應用程序和它的工作。

(也剛剛發現這一點:Single Form Hide on Startup

2

把你的電話在Windows事件循環是這樣的:

WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null); 

所以Hide()將在以後調用,從而解決您的問題

-2

在顯示的事件中調用Hide(),Hide()只設置Visible爲false,並且在顯示錶單之前,Visible屬性已經是false ...

相關問題