窗体不带参数
/// <summary> /// 获取或创建指定类型的单例窗体 /// </summary> /// <typeparam name="T">窗体类型(必须继承自Form)</typeparam> public static void ShowSingletonForm<T>() where T : Form, new() { // 查找已打开的同类型窗体 var existingForm = Application.OpenForms.OfType<T>().FirstOrDefault(); if (existingForm != null) { // 若已存在,激活并显示到最前 if (existingForm.WindowState == FormWindowState.Minimized) { existingForm.WindowState = FormWindowState.Normal; } existingForm.BringToFront(); existingForm.Focus(); } else { // 若不存在,创建新实例并显示 var newForm = new T(); newForm.Show(); } } //---------------------------------------------------- // 在需要打开Form2的地方调用 //FormSingletonManager.ShowSingletonForm<Form2>();
窗体带参数
/// <summary> /// 显示单例窗体(支持传入一个int参数) /// </summary> /// <typeparam name="T">窗体类型(继承自Form)</typeparam> /// <param name="param">需要传递给窗体的int参数</param> public static void ShowSingletonForm<T>(int param) where T : Form { // 查找已打开的同类型窗体 var existingForm = Application.OpenForms.OfType<T>().FirstOrDefault(); if (existingForm != null) { // 若已存在,激活窗体 if (existingForm.WindowState == FormWindowState.Minimized) { existingForm.WindowState = FormWindowState.Normal; } existingForm.BringToFront(); existingForm.Focus(); // 可选:如果需要更新已打开窗体的参数,可以在这里调用窗体的方法 // 例如:existingForm.UpdateParam(param); } else { // 若不存在,通过反射创建带int参数的窗体实例 // 要求窗体T必须有一个接收int参数的构造函数,例如:public Form2(int id) { ... } var newForm = (T)Activator.CreateInstance(typeof(T), param); newForm.Show(); } } //-------------------------------------------- // 打开Form2并传入参数 100(例如ID=100) //FormSingletonManager.ShowSingletonForm<Form2>(100);
本文来自 www.LuoFenMing.com