启动时隐藏窗体:为什么this.Hide()不会隐藏我的窗体?

16

我想在启动时隐藏我的应用程序的主窗口,所以我将以下代码放在构造函数中:

this.Hide();

然而,这并没有隐藏我的表格。似乎我只能用按钮来隐藏表格。我在这里做错了什么吗?


可能是重复的问题:this.Visible is not working in Windows Forms - Hans Passant
8个回答

31

您可以使用这行代码。它不会隐藏它,但是它将被最小化:

this.WindowState = FormWindowState.Minimized;

此外,如果您也不希望在任务栏上显示该内容,您可以添加这行代码:

this.ShowInTaskbar = false;

但是如果您一开始就不想让表单可见,为什么要创建它呢?


因为它将在Windows启动时开始,并以类似于防病毒和防火墙软件的方式驻留在系统托盘中。有任何想法为什么从窗体构造函数调用this.Hide()实际上并没有隐藏窗体? - Pieter
1
我认为这是因为在此时(运行构造函数时),您的表单尚未可见。只有在构造函数完成后,表单才会被创建并显示出来。所以你的唯一问题是因为它是从构造函数中完成的。我不建议这作为解决方案,但作为一个实验,可以设置一个计时器,并从构造函数中以1秒的延迟启动它,然后让timer_tick方法隐藏表单。这将起作用,因为在调用this.Hide()时,表单将可见。 - Øyvind Bråthen
当您在 program.cs 中有以下结构时:Application.Run(new Form1()),并尝试在 Form1 的构造函数中编写 Application.Exit() 时,您会遇到相同的问题。在调用 Application.Exit() 后,您的应用程序仍然可以运行,这是因为构造函数在 Application.Run 之前运行,因此没有任何效果。所以您也会面临同样的问题。您需要将它隐藏起来,只需让 Application.Run 让它再次变得可见和活跃即可。 - Øyvind Bråthen
1
我采用了你的解决方案,但我还在窗体的“Load”事件中附加了一个方法,以便在窗体加载完成后使用“this.Hide()”来正确隐藏窗口。谢谢! - Pieter
Form.Load 可能是一个不错的地方。有一个问题,因为我自己没有尝试过。如果您在 Load 事件中隐藏它而不在构造函数中将其最小化,那么窗体首先会出现,然后被隐藏,这样您就会看到闪烁。 - Øyvind Bråthen

14

只需要覆盖 OnVisibleChanged 方法并在其中更改窗体的可见性, 就像这样:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);
    this.Visible = false;
}

就是这样!简单而清晰。


这是可行的解决方案。调用表单Hide()函数并放置在上面的代码。谢谢:) - Marek Bar

5
如果你更喜欢使用 this.Hide 或 this.Show,你可以这样做。
protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    this.Hide();
}

2
我尝试通过在构造函数和OnLoad事件中将Visible设置为false或隐藏来实现此目的,但这两种方法都没有效果,因为窗体在创建后和OnLoad事件触发后会在SetVisibleCore中被设置为可见。
在Shown事件中将窗体设置为隐藏可以起作用,但是窗体会在屏幕上闪烁一会儿。
您还可以重写SetVisibleCore并将其值设置为false,但是这样OnLoad就不会被触发,并且其他一些事件(如窗体关闭)也会出现问题。
我认为最好的解决方案是在调用Application.Run()之前将窗体设置为最小化并在任务栏中不显示。
因此,不是:
Application.Run(new MainForm());

做:

MainForm form = new MainForm();
form.WindowState = FormWindowState.Minimized;
form.ShowInTaskbar = false;

Application.Run(form);

然后应用程序将以所有正确的事件运行(甚至是OnShown),但窗体不会显示。

如果您想在此之后像平常一样隐藏/显示窗体,则需要将WindowState和ShowInTaskbar设置回Normal和true。

在Shown事件中,您可以将ShownInTaskbar设置为true,然后正确地隐藏窗体。

this.Shown += new System.EventHandler(this.MainFormShown);

...

void MainFormShown(object sender, EventArgs e)
{
    this.ShowInTaskbar = true;
    this.Visible = false;
}

将窗口状态在表单隐藏时设置回正常状态没有效果,所以您需要在再次显示表单后进行操作,否则图标将出现在任务栏中,但表单将被最小化。
this.Show();
this.WindowState = FormWindowState.Normal;

1
上面的解决方案对我没有用。它会导致窗口在屏幕上短暂闪烁,然后被隐藏。而且它会阻止你之后显示表单。这种方法对我很有效。 - Jack Culhane

0
你可以在表单中创建一个名为 firstOpen 的 bool 变量,并将其放置在 Show 事件中。
    private void Form1_Shown(object sender, EventArgs e)
    {
        if (firstOpen)
        {
            this.WindowState = FormWindowState.Minimized;
            Hide();
            notifyIcon1.Visible = true;
        }
        firstOpen = false;
    }

第一次显示时,它将被隐藏。下一次将正常工作。


0
尝试在应用程序的主入口点加载之前将表单的可见属性设置为false。
Form1 obj = new Form1();
obj.visible = false;
Application.Run(obj);

或者尝试将表单的坐标设置为更高的位置,例如9000, 9000。


这不是一个解决方案。需要使用 OnVisibleChanged 的重写。请参见上文。 - Marek Bar
不要将表单放在屏幕外但仍可见。使用屏幕阅读器软件的盲人用户仍然可以“看到”它(使用alt-tab的用户也是如此)。 - micheal65536

0

要在启动时隐藏窗体,实际上非常简单。您可以创建窗体并将其存储在本地变量中,然后只需不将该窗体放入Application.Run()中,以便在启动时不呈现它:

Form1 form = new Form1(); 
Application.Run();  

Øyvind是正确的,从构造函数调用 this.Hide() 是行不通的,因为窗体还没有准备好。这样,由于窗体已经创建,您可以在窗体的任何函数中调用 this.Show(),并且如果您想要隐藏它,则可以调用 this.Hide()


0
您可以使用Form.Hide()来隐藏表单:
Form2 form = new Form2();
//Start Form2 hidden
form.Hide();
//Close Form2
form.Close();

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