C#跨窗体操作实例:引用传递实现多窗体切换

一只小鹿
一只小鹿
发布时间:2026-10-14 | 5人浏览过
原创

本文介绍在C# WinForms应用中,如何通过引用传递实现三个窗体间的顺序切换。核心在于利用对象引用属性,使子窗体能直接控制父窗体的显示与关闭,无需额外的全局变量或事件机制。

目标与场景概述

本实例旨在解决多窗体应用中的导航问题。假设我们需要实现以下业务逻辑:

  1. 第一步:在 Form1 中点击按钮,弹出 Form2,同时隐藏 Form1。
  2. 第二步:Form2 处理一定逻辑或计时后,点击按钮弹出 Form3(此时 Form2 保持存在,未被销毁)。
  3. 第三步:在 Form3 中点击按钮,同时关闭 Form3 和 Form2,并重新显示 Form1。

关键在于,当我们在最深层的 Form3 需要回到初始层 Form1 时,如果所有中间窗体都直接关闭了,Form1 将无法被找回。因此,我们采用引用传递的方式,让每个子窗体持有其父窗体的引用。

准备条件

  • 创建一个新的 C# Windows Forms 应用程序项目。
  • 在项目中默认生成三个窗体:Form1.cs, Form2.cs, Form3.cs。
  • 为每个窗体添加对应的触发按钮控件,用于演示跳转逻辑。

真实操作顺序

第1步:配置 Form1(入口窗体)

目的:启动 Form2 并将其自身隐藏,同时建立引用关系。

动作:双击 Form1 上的“打开Form2”按钮,编写点击事件代码。

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void 打开form2隐藏form1_Click(object sender, EventArgs e)
        {
            // 1. 实例化 Form2
            Form2 f = new Form2();
            
            // 2. 关键步骤:将当前窗体(this)的引用传递给 Form2
            f.fatherForm = this;
            
            // 3. 显示 Form2
            f.Show();
            
            // 4. 隐藏当前 Form1
            this.Hide();
        }
    }
}

完成状态:点击按钮后,Form1 消失,Form2 出现。此时 Form2 内部持有了 Form1 的内存地址。

第2步:配置 Form2(中介窗体)

目的:接收父窗体引用,并为子窗体 Form3 提供引用,从而形成引用链。

动作:

  1. 在 Form2.cs 顶部命名空间下或类内部声明一个公共属性 fatherForm,类型为 Form1。
  2. 双击“打开Form3”按钮,编写点击事件。
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        // 定义父窗体引用属性
        public Form1 fatherForm; 

        private void 打开from3_Click(object sender, EventArgs e)
        {
            // 1. 实例化 Form3
            Form3 f = new Form3();
            
            // 2. 关键步骤:将当前窗体(this)的引用传递给 Form3
            f.fatherForm = this;
            
            // 3. 显示 Form3
            f.Show();
            
            // 注意:此处不关闭 Form2,以便 Form3 可以通过引用找到它
        }
    }
}

完成状态:点击按钮后,Form3 弹出。Form3 内部持有了 Form2 的引用,而 Form2 内部持有 Form1 的引用。

第3步:配置 Form3(终点/回溯窗体)

目的:通过持有的引用,访问祖父窗体(Form1),实现多层级的窗体管理。

动作:

  1. 在 Form3.cs 中声明公共属性 fatherForm,类型为 Form2。
  2. 双击“返回Form1”按钮,编写逻辑以关闭自身和中层窗体,并唤醒最外层窗体。
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        // 定义直接父窗体引用
        public Form2 fatherForm; 

        private void 关闭form3from2显示from1_Click(object sender, EventArgs e)
        {
            // 1. 通过引用找到祖父窗体(Fom1)并显示
            // fatherForm 是 Form2,fatherForm.fatherForm 就是 Form1
            fatherForm.fatherForm.Show();
            
            // 2. 关闭中层窗体(Form2)
            fatherForm.Close();
            
            // 3. 关闭当前窗体(Form3)
            this.Close();
        }
    }
}

完成状态:点击按钮后,Form3 和 Form2 同时消失,Form1 重新出现在屏幕上。整个过程没有销毁 Form1,而是利用引用将其找回。

简要总结

该方案的核心在于引用传递而非数值传递。通过在每个子窗体中暴露一个公共的属性来接收父窗体的 this 引用,我们建立了窗体之间的层级联系。这种方法避免了创建全局静态变量的副作用,使得窗体间的通信更加面向对象且易于追踪数据流向。以上就是C#跨窗体操作(引用传递)的详细内容,更多关于C#窗体交互的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表