• C#WinForm 窗体单例模式 反射单例


    做了个mdi窗体 原以为指定一下MDIParent就可以了

    没想到多次点击会出现多个窗体的现像 所以用到了单例模式

    做法是这样的(学习出处:连接)

    1.在子窗体声明一个子窗体类型的私有静态变量 并把子窗体构造函数设为 私有 不私有也行不过单例调用时不要用new方法

    private static frmAACar fc = null;
    private frmAACar()
          {
              InitializeComponent();
    
           }

    2.声明一个public 静态函数 判断变量fc。不存在或只是关掉了 就new出来 

       public static frmAACar CreateSingle()
            {
                if (fc == null || fc.IsDisposed)
                {
                    fc = new frmAACar();
                }
    
                return fc;
            }

    3.调用

     frmAACar f = frmAACar.CreateSingle();
                f.Show();

    4.多个窗体使用泛型 (约定了 必须有个无参的构造函数 调用时对应的窗体构造函数应为public )

    //这里窗体是dotnetBar里的窗体继承来的,普通窗体继承Form就可以了  
    public class GenericSingleton<T> where T : DevComponents.DotNetBar.Metro.MetroForm, new()
        {
            private static T t = null;
    
            public static T CreateSingleton()
            {
                if (t == null || t.IsDisposed)
                { t = new T(); }
    
                return t;
            }
        
        }

    调用

    frmAACar fc=  GenericSingleton<frmAACar>.CreateSingleton();
                fc.MdiParent = this;
                fc.Show();

    反射单例

     /// <summary>
            ///通过反射创建子窗体
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                Type t = Assembly.Load("TestForm").GetType("TestForm.Form4");
                Form fc = (Activator.CreateInstance(t) as Form);
                if (!ShowChildForm(fc.Text, this))//通过name判断会更好一些 毕竟name不会重名
                {
                    fc.MdiParent = this;
                    fc.Show();
                }
                else
                {
                    fc.Dispose();
                }
            }
    
            /// <summary>
            /// 判断子窗体是不是存在
            /// </summary>
            /// <param name="sonText"></param>
            /// <param name="MdiParentForm"></param>
            /// <returns></returns>
            public static bool ShowChildForm(string sonText, Form MdiParentForm)
            {
    
                foreach (var mdic in MdiParentForm.MdiChildren)
                    if (mdic.Text == sonText)
                    {
                        mdic.BringToFront();
                        return true;
                    }
    
                return false;
            }
  • 相关阅读:
    jQuery右键菜单contextMenu使用实例
    如何调动员工的积极性 -引用LTP.Net知识库
    Linux 目录管理的相关命令
    linux bash基础特性
    Linux 文件系统简介(FHS:Filesystem Hierarchy Standard)
    Linux 基础命令
    docker 限制容器能够使用的资源
    docker 私有registry harbor安装
    docker Dockerfile里使用的命令说明
    docker 存储卷 Volumes
  • 原文地址:https://www.cnblogs.com/SoftWareIe/p/8709618.html
Copyright © 2020-2023  润新知