2012-03-12 92 views
2

是否可以在单例模式之后创建模态对话框?单例模态对话框

的理念是:

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 2012-03-12 16:37:41

+0

你为什么认为这会隐藏父窗体? – ionden 2012-03-12 16:41:12

+0

表单必须是单例,因为它需要很长时间才能被初始化,所以我只希望它被创建一次。我需要它是模态的,因为我需要用户回答 - 是或否。 – Cristiano 2012-03-12 16:41:44

回答

6

除了我的评论,不要这样做。不要将表单/对话框设置为单例。该对话框应该只显示您想要显示的数据的视图。数据的高速缓存应该在别处处理。因此,当您创建对话框时,将它传递给您想要显示的缓存对象。实质上,使用MVC模式。

  1. 我假设它是花费时间的数据,而不是对话框本身的结构。如果在对话框上构建控件的时间过长,那么对话框可能太复杂了?
+0

我必须感谢大家的答复,他们帮助我更好地理解问题。 – Cristiano 2012-03-12 20:31:01

0

我想,任何事情都是可能的,但:enter image description here

“就因为你可以并不意味着你应该。”

单例具有两个主要目的:将实例计数限制为1并为全局变量提供入口点。每当你决定做一个单身人士时,你对你的领域做出了一个非常具体和僵化的假设,包括你自己在内的所有未来的开发者都将受到影响。也就是说,你做出了一个(尴尬的)假设,即只有一个X可以存在。一旦你开始了这条道路,单身人士的全球性质将通过内联客户端调用来锁定你,并且在以后重新思考它会变成一个痛苦的世界。

所以,问问自己:有没有任何可能的方式可能需要支持多个对话窗口?如果这个问题的答案是或者甚至可能是“是”,那么你不希望这样做为单身。如果这个问题的答案是否定的,你可能仍然不想这样做。

+1

因为你可以[发布图片]这并不意味着你应该 – 2012-03-12 17:12:00

+1

以我的经验,直观教具帮助,但每一个他自己。如果您对此感觉足够强烈,请继续进行编辑。 – 2012-03-12 17:13:20