2010-09-18 68 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 ...

相关问题