предотвращение отображения нескольких экземпляров одной формы - PullRequest
7 голосов
/ 07 января 2010

Я работаю над приложением, в котором есть одна основная форма и несколько других форм, которые можно использовать одновременно. когда пользователь нажимает кнопку, чтобы открыть другую форму, я хотел бы сделать так, чтобы нажатие кнопки для формы не открывало форму снова, если она уже открыта.

showDialog не будет работать, поскольку пользователю по-прежнему необходимо иметь доступ к элементам управления в главной форме.

вот мой код для окна справки, все остальные формы открываются одинаково.

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

Ответы [ 8 ]

13 голосов
/ 07 января 2010

В качестве альтернативы вы можете использовать открытые формы приложения, чтобы увидеть, открыто ли оно

btn_LaunchHelp(object o, EventArgs e)
{

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

   new help().Show();
}

Редактировать: чтобы быть более понятным, это позволяет пользователю в любое время закрыть справку и делает управление намного проще, чем сохранение ссылки в окне справки. Нечего убирать, нечего обслуживать.

10 голосов
/ 07 января 2010

Используйте синглтон:

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 голосов
/ 07 января 2010

В зависимости от того, как вы хотите управлять этим, вы можете сделать несколько вещей:

  1. Используйте шаблон Singleton с глобальной блокировкой отслеживания, которая освобождается при удалении формы
  2. Управляйте состоянием в форме вызова и просто вызывайте «show», если форма уже запущена.
  3. Предварительно запустите форму, но не показывайте ее, чтобы управлять единственной ссылкой и просто показывать ее по мере необходимости
1 голос
/ 04 июля 2018

Ну, это может помочь, это сработало для меня

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/

1 голос
/ 14 июня 2016

Вы можете действовать следующим образом, объявив эти 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();

Надеюсь, это поможет.

0 голосов
/ 01 июня 2016

Может быть, это поможет вам.

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();
        }
    }
0 голосов
/ 07 января 2010

Рассматривали ли вы создание формы MDI? Это гарантирует, что ваша родительская форма всегда видна, а ваши дочерние формы содержатся внутри родительского. Затем вам нужно только просмотреть список форм и вызвать Show на них. Никаких синглетов не нужно (что многие считают плохой практикой программирования в любом случае).

0 голосов
/ 07 января 2010

Попробуйте сделать глобальную форму справки.

private Form help;

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

        help.Show();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...