当前位置: 首页 > news >正文

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

相关文章:

C# Winform 多窗体切换方式一

一、简介 在 Winform 开发中,多窗体的切换是一个常见的需求,比如登录成功后,切换至主界面,在网上查阅相关的资料,你会发现很多都是用 form2.Show(); this.Hide(); 这种方式,这种方式也存在一些问题&#…...

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址(高清无水印原图/持续更新/含榜单出处链接): 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志:常规更新Cinebench R23、PassMark笔记本CPU天梯图,新增Geekbench 6.2单核多核天梯图&…...

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…...

io目录操作学习

1、基本概念 目录也是一种文件,因此操作流程与普通文件类似,有诸如打开、关闭、定位等概念,但目录是一种特殊的文件,目录存储的数据的最小单位并不是字符,而是目录项。这使得目录跟普通文件又有区别。 在Linux中&…...

Ant-Design-Vue

Ant-Design-Vue是蚂蚁金服Ant Design官方推荐的Vue版UI组件库,它继承了Ant Design的设计语言和Vue.js的易用性,为开发者提供了丰富、高质量的Vue组件,极大地简化了前端开发流程。以下是一份详细的Ant-Design-Vue快速上手指南及排坑建议&#…...

2024互联网暑期实习面经和流程记录分享

2024互联网暑期实习面经和流程记录分享 面试经验和流程需要注意的点 面试经验和流程 因为敏感信息的原因,这里涉及到公司名字的全部进行打码 笔者投递和面试了很多公司,具体有包括算法和开发岗,下面的公司一律用字母代替。 O公司&#xff0…...

风云崛起之拉氏变换和拉式逆变换

图像的分割写出来了,但是写的不好,暂时先不发了。这两天小y想在把拉式变换的内容写出来,小y最近再看信号和电路,需要复习数学,所以把这点写出来。 首先要推出分布积分的公式,我们知道积分和微分为逆运算&am…...

1、.Net UI框架:WinUI - .Net宣传系列文章

WinUI(Windows UI Library)是微软提供的一个用于构建Windows应用程序的本机UI平台组件。它与Windows应用SDK紧密相关,允许开发者创建适用于Windows 10及更高版本的应用程序,并且可以发布到Microsoft Store。WinUI 3是最新的一代,它提供了与操…...

计算机的错误计算(五十九)

摘要 讨论用 Go语言实现的 函数的计算精度问题。 由计算机的错误计算(五十五)知,国际 IEEE 754 标准中, 函数具有定义域 . 那么,在常规编程模式下用 Go语言实现这个函数,其输出的精度如何? …...

【数学分析笔记】第1章第1节:集合(1)

作为一个计算机专业的人,想自学一下数学专业的专业课补一补AI基础,顺带写个笔记,听的课是陈纪修版本的数学分析: 1. 集合与映射 1.1 集合 1.1.1 基本概念 集合:由某种特定性质的具体的或抽象的对象汇集的总体。 集…...

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

GIT指令大全详解

目录 GIT指令详解 拉取 提交 分支操作(假设分支为a) 版本回退 主分支拉取到分支 常用的Git指令 一、初始化配置 二、初始化仓库 三、检查当前文件状态 四、添加 五、查看提交历史 六、撤销更改 七、查询 八、分支 九、标签管理 十、其他常用指令 GIT指令详解 Git是一个开源的分…...

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。

清华&百度等联合提出了ReSyncer,可以实现更高稳定性和质量的口型同步,而且还支持创建虚拟表演者所必需的各种有趣属性,包括快速个性化微调、视频驱动的口型同步、说话风格的转换,甚至换脸。 ReSyncer的工作原理可以简单理解为…...

论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法

摘要 YOLOv8-QSD网络是一种新型的无锚点驾驶场景检测网络,建立在YOLOv8的基础上,在保证检测精度的同时保持效率。该网络的骨干网采用结构重参数化技术来转换基于多样化分支块 (DBB) 的模型。 为了准确检测小目标,它集…...

Vue.js状态管理:Vuex与Pinia的比较

在 Vue.js 生态系统中,状态管理是构建复杂应用时的重要组成部分。Vue.js 提供了两种流行的状态管理库:Vuex 和 Pinia。虽然两者都旨在简化状态管理,但它们在设计哲学、API、性能和易用性方面有所不同。本文将深入探讨 Vuex 和 Pinia 的异同&a…...

OJ题目【栈和队列】

目录 有效的括号 有效的括号【代码】 用队列实现栈 用队列实现栈【代码】 用栈实现队列 用栈实现队列【代码】 设计循环队列 有效的括号 https://leetcode.cn/problems/valid-parentheses/submissions/551394950/ 思路:把左括号放到栈里,取出来栈…...

[shell][git]git将当前分支的HEAD指针重置到最后一次提交的状态

在Git中,git reset --hard HEAD 命令用于将当前分支的HEAD指针重置到最后一次提交的状态,并且会丢弃当前工作目录中的所有更改。这个命令的意思是: git reset:重置命令,用于将HEAD指针移动到指定的状态。--hard&#…...

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(六)卡尔曼滤波器二:图解卡尔曼滤波器;卡尔曼滤波器公式理解;面试答法;

上一篇卡尔曼滤波器一中,从整体上认识了,卡尔曼滤波器整体是在做一件什么事。 知道了,协方差就可以理解为偏差,或者误差。 这一篇主要讲卡尔曼滤波器中的公式,理解公式,就能知道如何实现卡尔曼滤波器。 上一篇:卡尔曼滤波器在做一件什么事,这一篇,卡尔曼滤波器怎么…...

高性能日志系统 日志输出模块逻辑

概述 该模块主要实现了一个日志系统的输出模块,通过多态、工厂模式等设计模式,构建灵活的日志输出架构。 功能:格式化完成的标准日志消息,输出到指定为止拓展:支持同时将日志落地到不同的位置,也就是输出日…...

haproxy基础

目录 1 HAProxy介绍 1.1 版本对比 1.2 HAProxy功能 2 参数介绍与实践 2.1 global参数说明 2.2 真实代码格式实例 2.3 常用全局参数 2.3.1 nbproc -- 开启几个进程 2.3.2 cpu-map(CUP绑定) 2.3.3 nbthread 2 --开启2个线程 3 Proxies配置 3.1 Proxies配置-defaults 3.2 Proxi…...

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C的岗位技能(红色标记为重点内容),欢迎大家前来学习指正&…...

LVS实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 四、测试 1.Director服务器采用双IP桥接网络,一个是VPP,一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网…...

pythonUI自动化008::allure测试报告(安装及应用)

allure报告预览 1 下载jdk,配置jdk Path变量: https://www.cnblogs.com/FBGG/p/15103119.html(这里不作阐述,请看该偏文章配置即可) 2 下载allure驱动,配置allure Path变量: 下载allure驱动&a…...

常用的 git 和 linux 命令有哪些?

对于 Git 命令: 1. git init:初始化一个新的 Git 仓库。 2. git clone:克隆一个远程仓库到本地。 3. git add:将文件添加到暂存区。 4. git commit:提交暂存区的更改。 5. git status:查看工作区和暂存…...

MYSQL 删除一个字段前,判断字段是否存在

开发过程中经常需要提交可以重复执行的sql,当设计到需要增加字段时,可以参考如下办法: 1.如果是mysql 版本高于5.7.5 ALTER TABLE table_name DROP COLUMN IF EXISTS column_name; 2.通用方法 写一个存储过程,然后用存储过程取…...

vulnstack-5

环境搭建 靶场虚拟机共用两个,一个外网一个内网,用来练习红队相关内容和方向,主要包括常规信息收集、Web攻防、代码审计、漏洞利用、内网渗透以及域渗透等相关内容学习。 虚拟机密码 win7 sun\heart 123.com sun\Administrator dc123.com # …...

回归预测|基于灰狼优化GWO-Transformer-BiLSTM组合模型的数据回归预测Matlab程序 多特征输入单输出

回归预测|基于灰狼优化GWO-Transformer-LSTM组合模型的数据回归预测Matlab程序 多特征输入单输出 文章目录 前言回归预测|基于灰狼优化GWO-Transformer-BiLSTM组合模型的数据回归预测Matlab程序 多特征输入单输出GWO-Transformer-BiLSTM 一、GWO-Transformer-BiLSTM模型二、实验…...

STM32的USB接口介绍

STM32 USB接口是STM32微控制器系列中集成的一种通信接口,它允许STM32微控制器与外部设备或计算机进行高速的数据传输和通信。以下是STM32 USB接口的简要介绍: 1. 接口类型 STM32的USB接口通常支持USB 2.0标准,部分高端型号可能还支持USB 3.…...

【中等】 猿人学web第一届 第2题 js混淆 动态cookie 1

目录 调试干扰Hook Function 加密参数定位hook Cookie AST 解混淆字符串解密还原解密函数AST 配合解密函数还原字符串 ASCII 编码字符串还原字符串相加花指令(对象)剔除无用代码虚假 if剔除无引用代码剔除无引用的对象数值还原 switch 还原完整的 AST 代码代码注意 还原加密 请…...

ubuntu 22.04 安装 docker(服务器从毛胚到精装)

1、用户操作 阿里云默认是 root 用户,我们一般要自己创建一个用户,然后给该用户 sudo 权限 添加用户 sudo adduser newUserName赋予sudo权限 sudo usermod -aG sudo newUserName删除用户 sudo deluser --remove-home --remove-all-files newUserNam…...