防止显示一个表单的多个实例

时间:2010-01-07 04:51:00

标签: c# forms window

我正在开发一个应用程序,其中有一个主要表单和几个可以同时使用的其他表单。当用户点击打开另一个表单时,我想使其单击表单按钮,如果表单已经打开,则不会再次打开表单。

showDialog无法正常工作,因为用户仍然需要访问主窗体上的控件。

这是我的帮助窗口代码,所有其他表单以相同的方式打开。

private void heToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form help = new help();
            help.Show();
        } 

8 个答案:

答案 0 :(得分:13)

或者,您可以使用应用程序的打开表单来查看它是否已打开

btn_LaunchHelp(object o, EventArgs e)
{

   foreach (Form f in Application.OpenForms)
   {
       if (f is HelpForm)
       {
           f.Focus();
           return;
       }
   }

   new help().Show();
}

编辑:为了更清楚,这允许用户随时关闭帮助,并且比保存对“帮助”窗口的引用更容易管理。无需清理,无需维护。

答案 1 :(得分:10)

使用单身人士:

class HelpForm : Form
{
   private static HelpForm _instance;
   public static HelpForm GetInstance()
   {
     if(_instance == null) _instance = new HelpForm();
     return _instance; 
   }
}

.......

private void heToolStripMenuItem_Click(object sender, EventArgs e)
{
     HelpForm form = HelpForm.GetInstance();
     if(!form.Visible)
     {
       form.Show();
     }
     else
     {
       form.BringToFront();
     }
}

答案 2 :(得分:2)

根据您的管理方式,您可以做一些事情:

  1. Singleton pattern与表格处理时发布的全局跟踪锁定一起使用
  2. 在调用表单中管理状态,如果表单已经启动,则调用“show”。
  3. 预先发布表单,但不显示,这样您就可以管理单个引用,只需根据需要显示它

答案 3 :(得分:1)

你可以这样继续,在顶部声明theese 2变量:

private static readonly object MyLock = new object();
private static Form1 _Instance = null;

之后

 public Form1 GetFormInstance
 {
        get
        {
            lock (MyLock)
            {
                if (_Instance == null || _Instance.IsDisposed)
                {
                    _Instance = new Form1();
                }
                else
                {
                    _Instance.BringToFront();
                }
                return Form1._Instance;
            }
        }
 }

输入Form1_FormClosed事件

Form1._Instance = null

在调用这样的表格之后:

Form1.GetFormInstance.Show();

希望它会有所帮助。

答案 4 :(得分:1)

这可以帮助它为我工作

private static Mutex m_Mutex;

 bool IsNew;
        m_Mutex = new Mutex(true, Application.ProductName, out IsNew);
        if (IsNew)
        {
            Application.Run(new Form1());
        }

有关更好的文档,请参见下文 http://projectpeeker.com/2018/07/04/opening-of-windows-application-multiple-times/

答案 5 :(得分:0)

也许它会帮助你。

private Form help;

private void heToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (help == null || (help != null && help.IsDisposed))
        {
            help = new Form();
        }
        if (!help.Visible)
        {
            help.Show();
        }
        else
        {
            help.BringToFront();
        }
    }

答案 6 :(得分:-1)

您是否考虑过制作MDI表格?这可确保您的父表单始终可见,并且您的子表单包含在父表单中。然后,您只需要遍历表单列表并在其上调用Show。不需要单身人士(无论如何,许多人都认为这是不好的编程实践)。

答案 7 :(得分:-3)

尝试将“帮助”表单设为全局。

private Form help;

private void heToolStripMenuItem_Click(object sender, EventArgs e)
        {
        if(help == null)
          help = new help();

        help.Show();
    }