做WinForm,尤其是管理系统,常常需要同一个窗口仅打开一个实例。也就是当这个窗口没有创建时,则创建窗口并显示;当窗口已存在时,则将其置于顶层并激活。
从设计模式的角度讲,应该算作单件模式(Singleton)了。
关于实现单件模式,可以参考http://terrylee.cnblogs.com/archive/2005/12/09/293509.html
介绍的比较详细了。
下面主要是针对窗口的单件模式。
窗口的单件也可通过在窗体类中写几句代码简单实现:
1. 将构造函数改为private
2. 添加静态属性Instance
3. 窗口关闭事件中,将instance置为null;
这样,便可以通过Form1.Instance生成唯一的窗口实例。
但是这样做,有很多不足:
1. 当Mdi主窗体中有很多子窗体,这些子窗体都要添加类似的重复代码。
2. 如果一个子窗体要调用另一个子窗体,并且不想跟从主窗体中打开的相同(即再创建一个窗口),则无法实现。(其实将构造函数改为public也可以实现,但又不算严格的单件了)
因此,最好通过写一个单独的类,通过这个类产生单件窗体。
显然,要用泛型实现:
}
where T : Form, new()表示T必需是Form且具有无参构造函数。
lockHelper是为了多线程安全,可参考上面的链接。
在生成新的窗体类时,instance.FormClosed +=new FormClosedEventHandler(DestroyForm);注册委托实现当窗体关闭时,将instance置空。
这样便实现了任何一个普通的窗体类,都可以通过调用此泛型类,生成单件窗体。
调用时,只要Singleton<ChildForm>.Instance
便可获得由这个类生成的ChildForm窗体的唯一实例。
当然,也可在MDI主窗体中写一个泛型函数,方便显示子窗体: