2012-03-12 5 views
2

Возможно ли создать модальную форму диалога, следуя шаблону singleton?Одиночный модальный диалог

Идея такова:

public partial class Singleton : Form 
{ 
    private static Singleton _instance = null; 

    private Singleton() 
    { 
     // Initialization code 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new Singleton(); 

      return _instance; 
     } 
    } 

    private void Singleton_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     _instance.Hide(); 
     e.Cancel = true; 
    } 

    private void buttonClose_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

Этот код работает отлично, если форма не является модальным (так, если используется метод Show()), но не работает, если форма является модальным (так , если используется метод ShowDialog()), так как это также скроет родительскую форму.

+5

Почему? Какая проблема должна решить? – Oded

+0

Почему вы думаете, что это скроет родительскую форму? – ionden

+0

Форма должна быть одноэлементной, потому что для ее инициализации требуется много времени, поэтому я хочу, чтобы она была создана только один раз. И мне нужно, чтобы это было модально, потому что мне нужен ответ пользователя - да или нет. – Cristiano

ответ

6

В дополнение к моему комментарию, не делайте этого так. Не заставляйте форму/диалог синглтон. В диалоговом окне нужно просто представить представление данных, которые вы хотите показать. Кэширование данных должно обрабатываться в другом месте . Итак, когда вы создаете диалог, передайте ему кешированные объекты, которые вы хотите отобразить. По существу, используйте шаблон MVC.

  1. Я предполагаю, что это данные, которые занимают время, а не структуру самого диалога. Если построение элементов управления в диалоговом окне занимает слишком много времени, возможно, диалог слишком сложный?
+0

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

0

Я полагаю, что все возможно, но: enter image description here

«Просто потому, что вы можете не означает, что вы должны.»

Одноэлемент имеет две основные цели: ограничение количества экземпляров до 1 и предоставление точки входа для глобальных переменных. Всякий раз, когда вы решите сделать что-то одноэлементным, вы делаете очень конкретное и жесткое предположение о своем домене, с которым будут привязаны все будущие разработчики, включая вас. А именно, вы делаете (неловкое) предположение, что только один X может существовать. Глобальный характер синглетов заблокирует вас через встроенные клиентские вызовы, как только вы начнете с этого пути, а переосмысление этого позже станет миром боли.

Итак, спросите себя: существует ли какой-либо мыслимый способ, который мне может понадобиться для поддержки более одного диалогового окна? Если ответ на этот вопрос есть или даже может быть «да», вы не хотите делать это как синглтон. Если ответ на этот вопрос нет, вы, вероятно, все еще не хотите делать это таким образом.

+1

Просто потому, что вы можете [отправить снимок] это не значит, что вы должны –

+1

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

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