在Windows窗体中,this.Visible无法工作

23

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

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

不起作用了,Visible属性仍然为true。我是不是漏掉了什么?

9个回答

42

是的,Visible属性在Windows Forms中非常重要,它会创建句柄并导致OnLoad()方法运行。换句话说,窗口在被显示之前并不存在。而且尝试撤销这个操作是无效的。

如果你使用NotifyIcon,通常希望仍然创建句柄但不显示窗口。你可以通过重写SetVisibleCore方法实现这一点:

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

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


10

看起来您可以使用以下内容:

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

我刚刚在WinForms应用程序中测试了它并且它有效。

(还发现这个:单窗体启动时隐藏)


这绝对是最容易实现的答案,而且还有额外的好处,它不会干扰正在处理的任何事件。 - The Lemon

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.

但这是我的主窗体,我如何使用这个语法来控制它? - Barun

2

将您的调用放入 Windows 事件循环中,如下所示:

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

所以稍后将调用Hide(),因此解决您的问题。

2
使用 this.Opacity = 0;

1

我认为这是因为窗口直到此事件之后才真正存在。最好在表单外部执行此操作:

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);
        }
    }

我试过了。但是在隐藏之前它会出现然后消失。而且我不想要它。 - Barun
那么我认为在显示表单之前,你必须进行所有的检查。请注意:即使这是你的主要表单,你也可以使用Main()函数来进行此检查。 - Paul Michaels
但我需要它在后台运行,我不能在启动之前做我的事情。 - Barun
如果您有需要使用的函数,则可以将其公开,实例化表单并从表单外部调用函数。请参见编辑后的答案。 - Paul Michaels

0
this.Opacity = 0;
this.ShowInTaskbar = false;

-4
在Shown事件中调用Hide(),Hide()只将Visible设置为false,在窗体显示之前,Visible属性已经是false了...

-5
使用 this.Hide() 隐藏你的窗口。使用 this.Close() 关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接