2014-12-29 4 views
1

У меня есть приложение, которое имеет диалоговое окно для ввода пользователем. Я хочу, чтобы этот диалог разрешался открывать только один раз в любой момент времени. Обычно я бы это сделал с помощью модального диалога, но мне нужно, чтобы пользователь мог взаимодействовать с родительской формой, пока диалог открыт. Я пытался добиться этого с помощью некоторого кода, как это:Singleton Диалог шаблон

private static Boolean dialogShown = false; 
    public Dialog() 
    { 
      if (!dialogShown) 
      { 
       dialogShown = true; 
       InitializeComponent(); 
      } 
      else 
      { 
       this.Close(); 
      } 
    } 

    private void Dialog_Closed(object sender, EventArgs e) 
    { 
      dialogShown = false; 
    } 

Проблема с этим состоит в том, что это возможно для кода, который строит эту форму IE

public void ShowDialog() 
    { 
     Dialog dialog = new Dialog(); 
     dialog.Show(); 
    } 

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

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

-Edit, я не должен был использовать Singleton, потому что это вызывало некоторую путаницу. Я предполагаю, что в этом Im Im только беспокоился о том, что в любой момент времени открывается один экземпляр этого диалога, и я не рассматриваю его как один и тот же экземпляр каждый раз. Я также не должен был использовать имя переменной Visible, потому что это тоже вводило в заблуждение. Я редактировал код, чтобы этого избежать. Извинения за вводящий в заблуждение пост ...

+0

Почему это должно быть диалоговое окно singleton? Какова проблема, которую вы пытаетесь решить? – xxbbcc

+0

Его пользовательский ввод для значения поиска. его единственное подходящее для одновременного открытия одного диалогового окна. Это не вызовет каких-либо проблем во время выполнения, чтобы иметь несколько диалогов, но легко для пользователя случайно открыть несколько экземпляров формы, и я хочу это предотвратить. –

+0

Плюс почему вы используете блокировку? Во всяком случае, диалоги могут отображаться только в потоке пользовательского интерфейса. Блокировка не покупает вам ничего. – xxbbcc

ответ

2

Close() будет располагать ваш диалог, чтобы вы не могли его повторно использовать.
Звоните Hide() вместо.

Некоторые другие примечания:

  • Вам не нужно обработчик событий
  • WinForms строго однопоточных; вам не нужны никакие ваши блокировки
  • Ни одна логика вашего конструктора не имеет смысла.
+0

Это хорошо сработало и сделало форму реального синглтона. И вы были на 100% прав, мне не нужен обработчик событий или блокировки, и мой конструктор теперь пуст. Спасибо @SLaks –

Смежные вопросы