winForm 窗体单例 (底层显示到上层,任务栏显示出来)

首次发布:2022-11-05

窗体不带参数

/// <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