单例模式--实现多文档窗口(MDI)

来源:互联网 发布:233网校软件下载 编辑:程序博客网 时间:2024/05/16 03:33

使用MSVisualStudio设计一个多文档窗口(MDI),然后创建一个工具栏(ToolStrip),在工具栏中添加一个按钮,单击该按钮会弹出一个“工具”窗口,使用单例模式进行设计,使得“工具”窗口只能弹出一个

1.设计一个多文档窗口:先创建一个空白解决方案,再添加MDI类

右击项目--选择“添加”--新建项--MDI父窗体


2.创建的MDI默认带有工具栏,然后自己添加按钮,如下图所示


3.单击工具按钮弹出子窗口:工具


对工具按钮的操作

private void Tool_Click(object sender, EventArgs e)        {            //Tool tool = 多文档窗口_单例模式.Tool.GetTool();            //tool.MdiParent = this;            //tool.Show();            Tool tool = 多文档窗口_单例模式.Tool.GetTool();            //if (tool == null && tool.IsDisposed)            //{            //    tool = 多文档窗口_单例模式.Tool.GetTool();            //}            tool.MdiParent = this;            tool.Show();            tool.Focus();        }
4.使用懒汉式单例对Tool进行设计,使之只能弹出一个“工具”窗口
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 多文档窗口_单例模式{    public partial class Tool : Form    {        private static Tool tool = null;        // 程序运行时创建一个静态只读的辅助对象        private static readonly object syncRoot = new object();        private Tool()        {            InitializeComponent();        }        // 返回单例实例 双重检查锁定的双重判断机制        public static Tool GetTool()        {            // 第一重判断,先判断实例是否存在,不存在再加锁处理            if (tool == null)            {                // 加锁的程序在某一时间只允许一个线程访问                lock (syncRoot)                {                    // 第二重判断                    if (tool == null)                    {                        tool = new Tool();                    }                    // 解决无法访问已释放对象                    tool.Disposed += new EventHandler(Tool_Disposed);                }            }            else            {                Console.WriteLine("工具窗口已创建,只能创建一个窗口");            }            return tool;        }        // 关闭子窗口之后能再次打开        static void Tool_Disposed(object sender, EventArgs e)        {            tool = null;        }        //private void Exit_Click(object sender, EventArgs e)        //{            //this.Dispose();        //}    }}

运行结果:


5.启动程序

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 多文档窗口_单例模式{    class Program    {        static void Main(string[] args)        {            Application.Run(new MDI());        }    }}


原创粉丝点击