C# 如何在不同窗体间切换,关闭子窗体后重新打开初始窗体
WinForm 窗体切换解决方案
方案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(); }
- 修改主窗体的按钮点击逻辑,把当前实例传给子窗体:
private void btn_Option1_Click(object sender, EventArgs e) { Visible = false; // 替换为你实际的子窗体类名,把当前主窗体实例this传入 你的子窗体类名 x = new 你的子窗体类名(this); x.Show(); }
注意:你原有代码中的
new Application()是错误写法,Application是WinForm的全局应用类,不能直接实例化,需要替换为你自己定义的子窗体类名。
方案2:事件订阅(耦合度更低)
如果不希望子窗体持有主窗体的引用,可以用事件通知的方式实现:
- 子窗体中自定义关闭通知事件:
// 子窗体类内部代码 public event Action OnChildFormClose; private void btn_Close_Click(object sender, EventArgs e) { // 触发关闭通知事件 OnChildFormClose?.Invoke(); this.Close(); }
- 主窗体订阅子窗体的关闭事件:
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
相关产品推荐
相关产品推荐

