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