现在的位置: 首页 > 综合 > 正文

泛型实现窗体实例单件化

2013年09月14日 ⁄ 综合 ⁄ 共 1904字 ⁄ 字号 评论关闭

做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主窗体中写一个泛型函数,方便显示子窗体:

抱歉!评论已关闭.