C# Winform 多窗体切换方式一

news/2024/10/21 11:48:12/

一、简介

在 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


http://www.ppmy.cn/news/1507016.html

相关文章

有限与无限游戏

1. 概念 有限的游戏以取胜为目的,具有确定的开始和结束,拥有特定的赢家,规则的存在就是为了保证游戏会结束。 无限的游戏却旨在让游戏永远进行下去,它没有确定的开始和结束,也没有赢家,它的目的在于将更多…

实现挂机会议

png py文件 import os import pyautogui import time from typing import Callable, Tuple from datetime import datetime import cv2#通过图像模板匹配在屏幕上找到指定区域并操作 def imgAutoClick(tempFile: str, whatDo: Callable[[Tuple[int, int, int, int]], None], …

Java 并发编程:ReentrantLock 锁与 AQS

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 030 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【OpenCV C++20 学习笔记】霍夫圆形变换-Hough Circle Transform

霍夫圆形变换 原理API实例 原理 霍夫圆形变换和霍夫直线变换的原理类似: 在霍夫直线变换中,笛卡尔坐标系中的直线被变换成了霍夫空间中的 ( r , θ ) (r, \theta) (r,θ)。在霍夫圆形变换中,笛卡尔坐标系中的圆被变换乘霍夫空间中的 C : ( …

Java二十三种设计模式-策略模式(13/23)

策略模式:灵活算法的替换与扩展 引言 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 基础…

cmake+ninja交叉编译android下的静态库

文章目录 cmakeninja案例背景重新安装ninja编译通过 参考 想整理一个库的cmake工程,他用 cmakeninja 简单了解了一下,是可以不依赖Android studio编译的cmake的,搜到了一个cmakeninja,参考[1] 案例 参考[1]中的代码 背景 cm…

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗?就是那种拥有一个属于自己的影音库,不用担心被和谐,随时可以登录访问电脑上的各种文件,相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘,可以实现…

【rx rb rz】Centos/Linux rx、rb、rz命令详细介绍

【rx & rb & rz】Centos/Linux rx、rb、rz命令详细介绍 简介 基础语法 选项介绍 基本用法 安全事项 环境变量 注意事项 简介 系统版本:Centos7.6 软件版本:lrzsz 0.12.20 rx、rb、rz命令属于lrzsz程序的内容,是使用纠错协议&a…