You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何在不同窗体间切换,关闭子窗体后重新打开初始窗体

WinForm 窗体切换解决方案

方案1:传递主窗体引用(实现最简单)

你只需要在实例化子窗体时,把当前初始主窗体的实例传入子窗体,子窗体关闭时直接调用主窗体的显示逻辑即可:

  1. 首先修改子窗体的构造函数,新增接收主窗体实例的参数:
// 子窗体类内部代码
private Form _mainForm;

// 自定义构造函数
public 你的子窗体类名(Form mainForm)
{
    InitializeComponent();
    _mainForm = mainForm;
}

// 子窗体关闭按钮点击事件 / 或者FormClosing事件中添加逻辑
private void btn_Close_Click(object sender, EventArgs e)
{
    // 恢复显示初始主窗体
    _mainForm.Visible = true;
    // 关闭当前子窗体
    this.Close();
}
  1. 修改主窗体的按钮点击逻辑,把当前实例传给子窗体:
private void btn_Option1_Click(object sender, EventArgs e)
{
    Visible = false;
    // 替换为你实际的子窗体类名,把当前主窗体实例this传入
    你的子窗体类名 x = new 你的子窗体类名(this);
    x.Show();
}

注意:你原有代码中的new Application()是错误写法,Application是WinForm的全局应用类,不能直接实例化,需要替换为你自己定义的子窗体类名。

方案2:事件订阅(耦合度更低)

如果不希望子窗体持有主窗体的引用,可以用事件通知的方式实现:

  1. 子窗体中自定义关闭通知事件:
// 子窗体类内部代码
public event Action OnChildFormClose;

private void btn_Close_Click(object sender, EventArgs e)
{
    // 触发关闭通知事件
    OnChildFormClose?.Invoke();
    this.Close();
}
  1. 主窗体订阅子窗体的关闭事件:
private void btn_Option1_Click(object sender, EventArgs e)
{
    Visible = false;
    你的子窗体类名 x = new 你的子窗体类名();
    // 订阅子窗体关闭通知,收到通知后显示主窗体
    x.OnChildFormClose += () => this.Visible = true;
    x.Show();
}

资源消耗说明

普通WinForm窗体的初始化和销毁资源占用极低,只要不是窗体内部加载了超大资源、数千个控件的特殊场景,每次关闭旧窗体再新建的性能损耗完全感知不到。
如果需要进一步优化,可以把四个子窗体提前声明为主窗体的全局字段,复用实例避免重复初始化:

// 主窗体类内部,提前声明所有子窗体实例
private 子窗体1类名 _option1Form = new 子窗体1类名();
private 子窗体2类名 _option2Form = new 子窗体2类名();
// 剩下两个子窗体同理声明

private void btn_Option1_Click(object sender, EventArgs e)
{
    Visible = false;
    _option1Form.Show();
}

内容的提问来源于stack exchange,提问作者Brian Gunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:54:04