winform 打开多个界面时,如果使用 Form.Show 方法,有时候没注意就把同一个窗体打开多次,这可能会导致数据混乱,如果去判断窗体是否打开也很麻烦,需要写一堆的代码才能实现,为了解决这个问题,我做了小小的封装,可以很好的解决这个问题。
新建类 FormManager
using System;
using System.Collections.Generic;
using System.Windows.Forms;public class FormManager
{private static Dictionary<Type, Form> _openForms = new Dictionary<Type, Form>();/// <summary>/// 窗体是否打开/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static bool IsFormOpen<T>() where T : Form{Type formType = typeof(T);return _openForms.ContainsKey(formType);}/// <summary>/// 获取打开的 Form 对象/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static T GetForm<T>() where T : Form{Type formType = typeof(T);if (_openForms.ContainsKey(formType))return (T)_openForms[formType];return null;}/// <summary>/// 打开窗体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="args"></param>/// <returns></returns>public static T OpenForm<T>() where T : Form, new(){Type formType = typeof(T);if (!_openForms.ContainsKey(formType)){T form = new T();form.FormClosed += (sender, e) => _openForms.Remove(formType);_openForms[formType] = form;form.Show();return form;}else{Form existingForm = _openForms[formType];if (existingForm.WindowState == FormWindowState.Minimized)existingForm.WindowState = FormWindowState.Normal;existingForm.BringToFront();return (T)existingForm;}}/// <summary>/// 打开窗体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="args"></param>/// <returns></returns>public static T OpenForm<T>(params object[] args) where T : Form{Type formType = typeof(T);if (!_openForms.ContainsKey(formType)){T form = (T)Activator.CreateInstance(formType, args);form.FormClosed += (sender, e) => _openForms.Remove(formType);_openForms[formType] = form;form.Show();return form;}else{Form existingForm = _openForms[formType];if (existingForm.WindowState == FormWindowState.Minimized)existingForm.WindowState = FormWindowState.Normal;existingForm.BringToFront();return (T)existingForm;}}/// <summary>/// 关闭窗体/// </summary>/// <typeparam name="T"></typeparam>public static void CloseForm<T>() where T : Form{Type formType = typeof(T);if (_openForms.ContainsKey(formType)){Form form = _openForms[formType];form.Close();}}
}
用法:
FormManager.OpenForm<Test1>();
另外我还封装了 判断界面是否打开、获取打开的 Form、打开有参数的 Form 窗体 等功能,用法就不一一展示了
end