单件实现winform多文档窗体的单开(2.0)



在Windows Forms(Winform)开发中,我们经常需要创建多个窗体来构建应用程序。然而,在某些情况下,我们希望确保特定类型的窗体在同一时间只能打开一个实例。这就是所谓的“单开”或“单例”模式。在C# 2.0中,我们可以利用单例设计模式来实现这一功能。下面我们将详细探讨如何实现Winform多文档窗体的单开。 理解单例模式。单例模式是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。在C#中,我们通常通过将构造函数设为私有,然后提供一个静态方法来获取实例来实现单例。 对于Winform应用,我们首先需要创建一个基类,这个基类将包含单例逻辑。代码如下: ```csharp public class SingletonForm : Form { private static volatile SingletonForm instance; private static object syncRoot = new object(); protected SingletonForm() { // 防止设计时显示 if (DesignMode) return; // 其他初始化操作 } public static SingletonForm Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) { instance = new SingletonForm(); } } } return instance; } } // 阻止其他地方创建实例 private SingletonForm(IntPtr handle) : base(handle) { } [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); protected override void CreateHandle(CreateParams cp) { if (instance != null) { SetParent(base.Handle, IntPtr.Zero); base.CreateHandle(cp); SetParent(base.Handle, instance.Handle); Close(); return; } else { instance = this; base.CreateHandle(cp); } } } ``` 在这个基类中,我们定义了一个静态成员`instance`用于保存单例实例,以及一个`syncRoot`对象用于同步多线程访问。`Instance`属性是获取实例的唯一途径,它确保在多线程环境下正确地创建并返回单例。 接着,我们需要创建继承自`SingletonForm`的窗体类。例如,我们创建一个名为`DocumentForm`的窗体,表示我们的多文档窗体: ```csharp public partial class DocumentForm : SingletonForm { public DocumentForm() { InitializeComponent(); } // 其他窗体特有的方法和属性 } ``` 现在,当尝试打开`DocumentForm`时,我们应该使用`SingletonForm.Instance`而不是直接调用构造函数。这样可以确保无论何时尝试打开新的`DocumentForm`,都只会返回已存在的实例或者创建一个新的实例(如果还没有创建过)。 例如,要在主窗体中打开`DocumentForm`,我们可以这样做: ```csharp private void OpenDocumentForm_Click(object sender, EventArgs e) { var documentForm = DocumentForm.Instance; documentForm.Show(); } ``` 在上述代码中,`OpenDocumentForm_Click`是主窗体上某个按钮的事件处理程序,点击按钮时,会显示已存在的`DocumentForm`或创建一个新的。 注意,这个实现也考虑了设计时的情况,确保在Visual Studio设计界面中不会出现问题。同时,当尝试创建第二个`DocumentForm`实例时,它会被关闭并重新定位到第一个实例。 总结,通过使用单例设计模式,我们可以确保在Winform应用程序中,特定类型的多文档窗体在同一时间只能有一个实例。这种方式有助于管理和控制窗体实例,防止资源浪费,并保持用户界面的一致性。在C# 2.0中,实现这样的功能并不复杂,只需要对单例模式有深入的理解,并结合Winform窗体的生命周期管理即可。
























































- 1

- buku772015-06-10新手学习了,谢谢分享

- 粉丝: 22
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于Qt数据库项目实现Sqlite3为例 (1).zip
- 基于仓颉编程语言的web快速开发框架.zip
- 基于51单片机的心率检测仪资源下载.zip
- 基于OpenCv的SVM实现车牌检测与识别系统.zip
- 基于pyqt5和MySQL的学生管理系统.zip
- 基于二次曲面模型的动态对象SLAM.zip
- 基于SpringBoot + Vue的社区桶装水配送平台.zip
- 一种基于氮转换速率的算法.zip
- 基于QChart和QChartView创建各种图表和美化图表.zip
- 基于SpringBoot + Vue在线电子书阅读平台.zip
- 基于爬虫技术的商品数据监测系统.zip
- 基于SpringBoot + Vue的城市社区食堂管理系统.zip
- 基于Witin-nn的ResNet18量化抗噪研究.zip
- 基于SpringBoot + Vue的实验室耗材管理系统.zip
- 针对月时间长度的重力观测数据的时頻分析方法和绘图.zip
- 基于深度学习的边缘提取方法.zip


