21

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

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

不管用。财产Visible仍然是真实的。我错过了什么吗?

4

9 回答 9

40

是的,Visible 属性在 Windows 窗体中很重要,这实际上是创建句柄并导致 OnLoad() 运行的原因。换句话说,窗口在可见之前是不存在的。它会忽略撤消此操作的尝试。

如果您使用 NotifyIcon,希望仍然创建句柄但不使窗口可见是很常见的。您可以通过重写 SetVisibleCore 来实现:

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

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

于 2010-09-18T18:43:01.693 回答
8

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

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

我刚刚在 winforms 应用程序中对其进行了测试,并且可以正常工作。

(也刚刚发现:Single Form Hide on Startup

于 2010-09-18T17:56:51.803 回答
2

采用this.Opacity = 0;

于 2010-09-18T17:35:38.933 回答
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.
于 2010-09-18T17:39:19.830 回答
2

像这样在 Windows 事件循环中调用:

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

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

于 2010-09-18T17:58:24.160 回答
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);
        }
    }
于 2010-09-18T17:35:29.777 回答
0
this.Opacity = 0;
this.ShowInTaskbar = false;
于 2018-04-13T06:12:55.187 回答
-4

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

于 2015-08-18T10:16:44.930 回答
-5

用于this.Hide()隐藏您的窗口。this.Close() 关闭

于 2010-09-18T17:34:33.053 回答