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

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

showDialog不会工作,因为用户仍然需要访问主窗体上的控件。

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

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

使用单身人士:

 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(); } } 

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

 btn_LaunchHelp(object o, EventArgs e) { foreach (Form f in Application.OpenForms) { if (f is HelpForm) { f.Focus(); return; } } new help().Show(); } 

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

根据您的管理方式,您可以执行以下操作:

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

那么这可以帮助它对我有用

 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/

也许它会对你有所帮助。

 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(); } } 

你可以像这样继续,在顶部声明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(); 

希望它会有所帮助。

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

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

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