C# 防止显示一个窗体的多个实例

C# 防止显示一个窗体的多个实例,c#,forms,window,C#,Forms,Window,我正在处理一个应用程序,其中有一个主表单和几个其他表单可以同时使用。当用户单击打开另一个表单时,我希望这样做:如果表单已经打开,则单击该表单的按钮不会再次打开该表单 showDialog无法工作,因为用户仍然需要访问主窗体上的控件 这是我的帮助窗口代码,所有其他表单都以相同的方式打开 private void heToolStripMenuItem_Click(object sender, EventArgs e) { Form help = new he

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

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

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

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

根据您希望如何管理,您可以做以下几件事:

  • 将与释放表单时释放的全局跟踪锁一起使用
  • 管理调用表单中的状态,如果表单已经启动,只需调用“show”
  • 预启动表单,但不显示表单,这样您可以管理单个引用,并根据需要显示表单

  • 试着让你的帮助成为全球性的

    private Form help;
    
    private void heToolStripMenuItem_Click(object sender, EventArgs e)
            {
            if(help == null)
              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();
    }
    

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

    您是否考虑过制作MDI表单?这样可以确保父窗体始终可见,并且子窗体包含在父窗体中。然后,您只需浏览表单列表并在其上显示。不需要独裁者(很多人认为这是糟糕的编程实践)。

    也许会对你有所帮助。

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

    您可以这样进行,在顶部声明这两个变量:

    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\u FormClosed事件

    Form1._Instance = null
    
    按如下方式调用表单后:

    Form1.GetFormInstance.Show();
    

    希望它能帮上忙。

    好吧,这对我来说很有帮助

    private static Mutex m_Mutex;
    
     bool IsNew;
            m_Mutex = new Mutex(true, Application.ProductName, out IsNew);
            if (IsNew)
            {
                Application.Run(new Form1());
            }
    
    有关更好的文档,请参阅下文

    关闭表单时将变量_instance设为null将非常完美:)@mlettele您的代码似乎有错误,因为非静态变量不能在静态方法中使用