【问题标题】:Hiding forms on startup: why doesn't this.Hide() hide my form?启动时隐藏表单:为什么 this.Hide() 不隐藏我的表单?
【发布时间】:2010-09-22 12:49:00
【问题描述】:

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

this.Hide();

但这并没有隐藏我的表单。似乎我只能获得隐藏表单的按钮。我在这里做错了吗?

【问题讨论】:

标签: c# forms


【解决方案1】:

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

this.WindowState = FormWindowState.Minimized;

另外,如果你不希望它显示在任务栏上,你可以添加这一行:

this.ShowInTaskbar = false;

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

【讨论】:

  • 因为它将从 Windows 启动并以类似于防病毒和防火墙软件的方式驻留在系统托盘中。知道为什么this.Hide() 在从表单构造函数调用时实际上并没有隐藏表单吗?
  • 我认为这是因为此时(运行构造函数时)您的表单尚未显示。只有在构造函数完成后,表单才会被创建并可见。所以你唯一的问题为什么这不起作用是因为它是从构造函数完成的。我不建议将此作为解决方案,但作为实验,制作一个计时器并从构造函数启动它,延迟 1 秒,并让 timer_tick 方法隐藏表单。这将起作用,因为在您调用 this.Hide() 时,表单将是可见的。
  • 当您在 program.cs 中有这样的构造时,您会遇到同样的问题: Application.Run(new Form1());并且您尝试在 Form1 的构造函数中编写 Application.Exit()。在 Application.Exit() 调用之后,您的应用程序仍然可以正常运行,这是因为构造函数在 Application.Run 之前运行,因此不会产生任何效果。所以对你来说同样的问题。你把它隐藏起来,只是为了让 Application.Run 让它变得活跃并再次启动。
  • 我采用了您的解决方案,但我还为表单的 Load 事件附加了一个方法,以便在加载表单后使用 this.Hide() 正确隐藏窗口。谢谢!
  • Form.Load 可能是一个很好的地方。一个问题,因为我没有尝试过自己。如果您不在构造函数中将其最小化,表单是否首先出现,然后被隐藏,如果您从 Load 事件中隐藏它,您会遇到闪烁?
【解决方案2】:

只需重写 OnVisibleChanged 方法并在其中更改表单的可见性,如下所示:

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

就是这样!简单干净。

【讨论】:

  • 这是有效的解决方案。调用表单 Hide() 函数并将其放在代码上方。谢谢:)
【解决方案3】:

如果您更愿意使用 this.Hide 或 this.Show,您可以这样做

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    this.Hide();
}

【讨论】:

    【解决方案4】:

    我尝试通过将 Visible 设置为 false 或隐藏在构造函数和 OnLoad 事件中来做到这一点。

    这些都没有任何效果,因为在创建表单后和触发 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;
    }
    

    在窗体隐藏时将 WindowState 设置回 Normal 无效,因此您需要在再次显示窗体后执行此操作,否则图标将在任务栏中但窗体将被最小化。

    this.Show();
    this.WindowState = FormWindowState.Normal;
    

    【讨论】:

    • 上面的工作解决方案对我不起作用。它导致窗口在被隐藏之前在屏幕上短暂闪烁。它还可以防止您之后显示表单。这种方法对我来说效果很好。
    【解决方案5】:

    在将表单加载到应用程序的主入口点之前,尝试将其可见属性设置为 false。

    Form1 obj = new Form1();
    obj.visible = false;
    Application.Run(obj);
    

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

    【讨论】:

    • 这不是解决方案。需要使用 OnVisibleChanged 的​​覆盖。见上文。
    • 不要将表单放在屏幕外但仍然可见。使用屏幕阅读器软件的盲人用户仍然会“看到”它(就像使用 alt-tab 的用户一样)。
    【解决方案6】:

    您可以使用Form.Hide() 启动隐藏表单:

    Form2 form = new Form2();
    //Start Form2 hidden
    form.Hide();
    //Close Form2
    form.Close();
    

    【讨论】:

      【解决方案7】:

      您可以在表单中创建一个 firstOpen 布尔变量并在 Show 事件中创建它

          private void Form1_Shown(object sender, EventArgs e)
          {
              if (firstOpen)
              {
                  this.WindowState = FormWindowState.Minimized;
                  Hide();
                  notifyIcon1.Visible = true;
              }
              firstOpen = false;
          }
      

      在第一次显示时,它会被隐藏。下次正常使用。

      【讨论】:

        【解决方案8】:

        要在启动时隐藏表单,实际上非常简单。您可以创建表单并将其存储在局部变量中,并且根本不将表单放入Application.Run(),以便在启动时不会呈现:

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

        Øyvind 说得对,因为表单还没有准备好,所以从构造函数调用 this.Hide() 将不起作用。这样,由于表单已经创建好了,你可以在表单的任何函数中调用this.Show(),如果要隐藏它,可以调用this.Hide()

        【讨论】:

          猜你喜欢
          • 2010-10-06
          • 1970-01-01
          • 2010-10-05
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          • 2011-07-27
          • 2014-08-28
          • 1970-01-01
          相关资源
          最近更新 更多