做了个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; }