【问题标题】:How to check if a windows form already exists, open it if it does, creates a new one if it doesn't? [duplicate]如何检查windows窗体是否已经存在,如果存在则打开它,如果不存在则创建一个新的? [复制]
【发布时间】:2016-01-14 14:41:30
【问题描述】:

我基本上想要这样的东西:

if (form.isOpen() == true)
    form.ShowDialog();
else
    form f = new form();

我有一个显示添加到订单的项目列表的表单,但是当我转到另一个页面并导航返回以创建订单时,它调用form f = new form();,我相信这会重置表单。关于如何克服这个问题的任何建议?

【问题讨论】:

  • 基本上,您想知道是否打开了form 的任何实例?
  • 是的,一个特定的表格(只有一个)
  • 如果表单仍在范围内,那么您不需要检查是否已经存在,您应该能够始终显示它

标签: c# forms winforms


【解决方案1】:

您可以使用Application.OpenForms 属性检查打开了哪些表单,如下所示:

if (Application.OpenForms.OfType<MyForm>().Any())
{
    Application.OpenForms.OfType<MyForm>().First().BringToFront();
}
else
{
    form f = new MyForm();
    f.show();
}

【讨论】:

  • 这很好用,您不需要使用showDialogue 并使表单成为模态。当然,您只能拥有该表单的 一个 实例。
【解决方案2】:

使用静态属性Application.OpenForms

YourFormType f = Application.OpenForms.OfType<YourFormType>().FirstOrDefault();
if (f != null)
    f.ShowDialog();
else
{
    using(f = new YourFormType())
    {
        f.ShowDialog();
    }
}

但是我不知道这是否能解决您的问题。您最好将表单与其支持数据分开并使用绑定将两者连接起来。当您向后导航时,您只需将支持数据传递给表单的新副本。查看 MVVM 之类的概念以获取更多信息。

【讨论】:

    【解决方案3】:

    如果您调用 ShowDialog(),您将无法转到同一应用程序中的另一个表单(除非您有多个 UI 线程)。如果你的意思是 Show() 而不是 ShowDialog 我会说你只有一个

         Form _form;
    

    在你的课堂上添加一些保护代码,就像这样(一般的想法,虽然):

         void ShowOrCreate()
         {
            if(_form==null)
            {
                _form = new MyForm();
                _form.Closed += OnMyFormClosed();
                _form.Show();
            }
            else
            {
                _form.BringToFront();
            }
          }
    
          void OnMyFormClosed(...)
          {
             _form = null;
          }
    

    抱歉缺少部分和方法签名,我相信可以在 MSDN 中轻松检查。

    【讨论】:

      【解决方案4】:

      一种 singleton 假设您想要每个应用程序的给定表单的单个实例:

      public MyForm: Form
      {
          private static MyForm _instance;
      
          public static MyForm Instance
          {
              get
              {
                  if(_instance == null)
                      _instance = new MyForm();
                  return instance;
              }
          }
      }
      

      现在您可以简单地使用MyForm.Instance。请注意,使用这种方法,您永远不想调用MyForm.Instance.Close()(或者您必须重新创建实例)。使用Show/Hide(无模式)或ShowDialog/Hide(模式)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 2011-09-15
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多