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