【问题标题】:How to get form when it is which is not visible?当它是不可见的时如何获得形式?
【发布时间】:2015-10-13 10:56:48
【问题描述】:

我想获得开放但隐藏的表格。我已经试过了。我得到了表格,但在这种情况下,表格会在几分之一秒内显示和隐藏。如果我跳过mfrm.Show(),我不会在Application.OpenForms 中获得MailSynchronize 表单。

MailSynchronize mfrm = new MailSynchronize();
mfrm.Show();
mfrm.Hide();

我通过以下方法获取表单。

foreach (Form f in Application.OpenForms)    //it will return all the open forms
{
     if (f.Name == "MailSynchronize")
     {
          mfrm = (MailSynchronize)f;
          break;
     }
}

谁能建议我如何获得默认隐藏的打开表单,我可以进入Application.OpenForms

【问题讨论】:

  • 如果您只需要该表单的一个实例,您可能需要考虑使用Singleton
  • 不值得写答案:保存mfrm 的实例,使其成为可通过属性访问的字段并使用该属性而不是枚举Application.OpenForms

标签: c# .net forms winforms windows-forms-designer


【解决方案1】:

如果我隐藏一个表单,它是否存在于 Application.OpenForms 中?

不,很遗憾,如果您Hide 一个表单,它将不会出现在Application.OpenForms

那么如何打开一个不可见的表单呢?我也希望它存在于 Application.OpenForms 中。

如果您想打开一个不可见的表单,并且希望它存在于 Application.OpenForms 中,您可以使用此代码而不是简单的 Show()

var f = new MailSynchronize();
f.Opacity = 0; 
f.ShowInTaskbar = false;
f.Show();

如何再次找到该表单?

要获取表单的打开实例,您可以使用Application.OfType<MailSynchronize>()

var f= Application.OpenForms.OfType<MailSynchronize>()
                  .FirstOrDefault();

找到后如何再次显示?

f.Opacity = 1;
f.ShowInTaskbar = true;
f.Show();

如何再次隐藏?

您不应该调用Hide() 来隐藏表单,因为它会使表单脱离Application.OpenForms,而应该使用这种方式:

f.Opacity = 0; 
f.ShowInTaskbar = false;

还有其他方法吗?

是的,例如您可以在类中创建静态属性,例如在Program.cs 中这样:

public static MailSynchronize MailSynchronizeInstance { get; set; }

当你第一次打开你的表单时,你可以把实例赋值给这个属性,然后你可以使用 Program.MailSynchronizeInstance 来显示或隐藏它,你不需要看Application.OpenForms 或执行解决方法。

您也可以以单音方式制作此属性。

【讨论】:

  • 我没有收到表格。如果我使用“MailSynchronize mfrm = new MailSynchronize(); mfrm.Show(); mfrm.Hide(); 我会得到。请建议我如何打开表单。
  • @NJBhanushali 检查更新和描述。我认为答案包含您所需要的。
  • Aghaie,它第一次运行良好。我不知道为什么,但我没有第二次在 Application.OpenForms 中获得表单。无论如何,它以其他方式工作正常。请检查答案。
  • @NJBhanushali 可能导致此类问题的事情是致电Hide()
  • @NJBhanushali 您应该按照答案中描述的方式使表单不可见。 “如何再次隐藏它?”
【解决方案2】:

编辑

现在这应该适用于您的具体情况:

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

当您在 MailSynchronize 构造函数中添加这 2 个代码行时,表单将开始最小化,但不会显示在您的任务栏中,这实际上是您正在寻找的效果。此外,该表单现在将在您的 Application.OpenForms 集合中弹出。

【讨论】:

  • 我试过了,但结果和上面一样。首先它显示表单,然后隐藏表单。在这种情况下,用户可以很容易地识别出该表单是打开的,然后是隐藏的。
  • 我已经编辑了我的答案,第二个答案现在应该可以帮助你更多。
  • 你能告诉我应该如何以及在哪里使用这个覆盖方法吗?
  • 您采用此覆盖方法并将其放入您的 MailSynchronize 表单中。如果您现在调用 MailSynchronize 表单,它应该被隐藏。
  • 它停止显示和隐藏表单。但我没有在 Application.OpenForms 中获得表单。
【解决方案3】:

表单初始化时。

MailSynchronize mfrm = new MailSynchronize();
mfrm.Opacity = 0;
mfrm.Show();
mfrm.Hide();

如何再次找到该表单?

foreach (Form f in Application.OpenForms)    //it will return all the open forms
{
     if (f.Name == "MailSynchronize")
     {
          mfrm = (MailSynchronize)f;
          break;
     }
}

当我找到它时,如何再次显示它?

mfrm.Opacity = 1;
mfrm.Show();

按按钮再次隐藏。

mfrm.Hide();    //It will not show form in Application.OpenForms if I hide again by mfrm.Opacity = 0;

【讨论】:

    【解决方案4】:

    使用 f.Visible(返回类型为 bool)

    如果返回 false,则表示表单已隐藏。如果它返回 true,那么表单是可见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2022-11-11
      • 2020-03-27
      相关资源
      最近更新 更多