C# Winform 多窗体切换方式一

一、简介

在 Winform 开发中,多窗体的切换是一个常见的需求,比如登录成功后,切换至主界面,在网上查阅相关的资料,你会发现很多都是用 form2.Show();  this.Hide(); 这种方式,这种方式也存在一些问题,因为 Winform 存在一个主线程概念,如果主线程关闭,那么当前软件所有的窗体都会随之关闭,你也可以使用其他的方式,让界面继续显示,但整体上不是特别的优雅,这里推荐两种方式,1.在 Form1 里面加载用户控件,并实时改变 Form1 界面大小和用户控件保持一致,2.用一个窗体作为主线程启动,启动后隐藏界面,添加一个窗体管理类来实现其他的窗体的关闭和显示,如果最后一个显示的窗体关闭了,就关闭主线程退出程序,本篇文章我就使用第一种方式来实现效果。

效果:

二、实现效果

新建一个 Winform 项目,Form1 如下:

这里添加了背景颜色,主要作用是在后面切换用户控件时,观察是否严丝合缝。

添加了一个按钮,这个按钮用来切换用户控件。

另外,添加了三个用户控件:

1.Login

模拟登录界面

代码:

using System;
using System.Windows.Forms;

namespace Winform多窗体切换
{
    public partial class Login : UserControl
    {
        public Login()
        {
            InitializeComponent();
            this.ParentChanged += MyUserControl_ParentChanged;
        }

        private void Login_Load(object sender, EventArgs e)
        {
            //Console.WriteLine($"Login 宽度:{this.Size.Width},高度:{this.Size.Height}");
            Console.WriteLine("登录界面 Login_Load 方法");
        }

        private void MyUserControl_ParentChanged(object sender, EventArgs e)
        {
            // 检查控件是否被移除
            if (this.Parent == null)
            {
                // 在这里添加你的清理代码,例如,释放托管资源,取消事件订阅等
                Console.WriteLine("登录界面 Disposed 方法");
            }
            else
            {
                //在 Form1 添加当前用户控件时,这里会被执行
                Console.WriteLine("登录界面 Parent Changed: New Parent = " + this.Parent.Name);
            }
        }
    }
}

由于用户控件没有 FormClosing 方法,这里订阅 ParentChanged 方法来实现这一效果,我试着订阅其他很多方法,都没有效果。

2.Setting

模拟设置界面

这里添加了四个按钮,用来判断用户控件是否显示完整

代码:

using System;
using System.Windows.Forms;

namespace Winform多窗体切换
{
    public partial class Setting : UserControl
    {
        public Setting()
        {
            InitializeComponent();
        }

        private void Setting_Load(object sender, EventArgs e)
        {
            //Console.WriteLine($"Setting 宽度:{this.Size.Width},高度:{this.Size.Height}");
            Console.WriteLine("设置界面 Login_Load 方法");
        }
    }
}

3.Main

用来模拟主界面

代码:

using System;
using System.Windows.Forms;

namespace Winform多窗体切换
{
    public partial class Main : UserControl
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)
        {
            //Console.WriteLine($"Main 宽度:{this.Size.Width},高度:{this.Size.Height}");
            Console.WriteLine("Main 界面 Main_Load 方法");
        }
    }
}

Form1 代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Winform多窗体切换
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int Index = 0;
        //高度页边距
        private int WidthMargins = 16;
        //高度页边距(无边框则为0)
        private int HeightMargins = 39;

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Index++;

            //防止测试按钮被移除
            foreach (Control c in this.Controls)
            {
                if (c.Name != "button1")
                    this.Controls.Remove(c);
            }

            if (Index == 1)
            {
                Login login = new Login();
                this.Controls.Add(login);
                this.Size = new Size(login.Width + WidthMargins, login.Height + HeightMargins);
            }
            else if (Index == 2)
            {
                Main main = new Main();
                this.Controls.Add(main);
                this.Size = new Size(main.Width + WidthMargins, main.Height + HeightMargins);
            }
            else if (Index == 3)
            {
                Setting setting = new Setting();
                this.Controls.Add(setting);
                this.Size = new Size(setting.Width + WidthMargins, setting.Height + HeightMargins);
            }

            if (Index >= 3)
                Index = 0;
        }
    }
}

运行:

源码不需要积分和付费哦

https://download.csdn.net/download/qq_38693757/89627203

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C是一种高级的程序设计语言,被广泛应用于开发各种软件和系统。它由美国计算机科学家丹尼斯·里奇在20世纪70年代初发明,并在随后的几十年中持续发展和改进。C语言具有简洁、高效、灵活和可移植的特点,因此得到了广泛的认可和使用。 C语言在计算机科学教育中被广泛教授,并被认为是学习其他高级编程语言的基础。学习C语言可以帮助人们理解计算机底层的原理和工作机制,并培养良好的编程习惯。C语言的语法相对简单,但功能强大,可以实现底层的系统编程,如操作系统、设备驱动程序等,也可以用于开发各种应用软件,如游戏、图形界面和网络应用等。 C语言具有许多重要的特性,例如指针、结构体和动态内存管理等。指针是C语言的核心概念之一,通过它可以访问和修改内存中的数据。结构体允许将不同类型的数据组合在一起,形成一个新的数据类型。动态内存管理允许程序在运行时动态分配和释放内存,提高内存的利用效率。 C语言还具有丰富的库函数和工具,可以大大简化编程的过程。标准C库提供了许多常用的函数,如输入输出、字符串处理和数学计算等。此外,C语言还支持宏定义、条件编译和模块化编程等特性,使得程序的可读性和维护性更强。 总之,C语言是一种强大而灵活的编程语言,被广泛应用于各个领域。它不仅有助于人们理解计算机的运行机制,还可以用于开发各种软件和系统,因此在计算机科学教育和工程实践中占有重要地位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值