this.Visible在Windows窗体中不起作用

我有个问题。 我需要在窗口加载时隐藏我的窗口。 但

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

不pipe用。 而财产Visible仍然如此。 我错过了什么吗?

是的,Visible属性在Windows窗体中是一个大问题,这就是实际获取创build的句柄并导致OnLoad()运行的原因。 换句话说,窗口直到可见才会存在。 它会忽略企图解决这个问题。

如果您使用NotifyIcon,想要仍然创build句柄但不使窗口可见,这是相当常见的。 你可以通过覆盖SetVisibleCore来实现这个function:

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

请注意,OnLoad在窗口实际可见之前仍然不会运行,因此必要时将代码移入构造函数中。 只需在NotifyIcon的上下文菜单事件处理程序中调用Show()以使窗口可见即可。

看来你可以使用以下内容:

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

我只是在一个winforms应用程序中testing它,它的工作。

(也只是发现这个: 启动时单表隐藏

我认为从窗体的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. 

把你的呼叫放入Windows事件循环中,如下所示:

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

所以Hide()将在以后被调用,从而解决你的问题。

我相信这是因为这个窗口直到这个事件发生之后才真正存在。 最好的地方是这样的:

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

如果你真的需要在表单本身内部完成,那么我认为你需要使用Activated事件。

编辑:

你也可以尝试这样的:

  static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 myform = new Form1(); if (myform.CheckStuff()) { Application.Run(myform); } } 

使用this.Opacity = 0;

使用this.Hide()来隐藏你的窗口。 this.Close( )closures

在Shown事件中调用Hide(),Hide()只设置Visible为false,并且在显示表单之前,Visible属性已经是false …