C#winform实现单页面自由切换窗口

一、介绍

这是效果图,由于视频压缩画质很差,看个效果就好。
在这里插入图片描述
左侧是打开界面的按钮,点击左侧按钮右侧打开不同窗口,点击右侧窗口中的按钮,也可以切换页面,可以方便的进行返回、下一页等操作。
每个窗口打开时其他窗口就会被释放,每次打开的新窗口都是新的实例,这一点可以自行根据需要进行设置,也可以不释放已打开的窗体,使它在后台保持运行状态。打开新窗体时如果不保留旧窗体的话,需要在关闭前把旧窗体的资源释放掉,例如定时器,线程什么的。

二、实现
  1. 首先创建项目,在主窗体中放置一个 SplitContainer 进行左右布局,左侧放按钮,右侧用于显示窗体。在这里插入图片描述
  2. 创建Size和上图中 Panel2 一样的子窗体,把 BorderStyle 设置为 none。
    在这里插入图片描述
  3. 在主窗体代码中声明子窗体对象
    在这里插入图片描述
  4. 在主窗体编写打开特定窗体的方法
    如下是打开 frmHome 子窗体的方法,打开其他子窗体的方法除了名字完全一样。
private void openHomePage()
{CloseOtherForms();//先关闭除主窗体以外的其他窗体,即关闭所有子窗体frmHome = new FrmHome();//实例化frmHome子窗体frmHome.Dock = System.Windows.Forms.DockStyle.Fill;//设置Dock为Fill使子窗体占满splitContainer1.Panel2frmHome.TopLevel = false;//设置为非顶级控件,否则无法添加frmHome.Show();//使窗体显示splitContainer1.Panel2.Controls.Clear();//清除splitContainer1.Panel2内容splitContainer1.Panel2.Controls.Add(frmHome);//将frmHome添加到splitContainer1.Panel2中
}

关闭除主窗体以外的其他窗体的方法:

private void CloseOtherForms()
{// 获取当前打开的所有窗体Form[] openForms = Application.OpenForms.Cast<Form>().ToArray();foreach (Form form in openForms){// 关闭除主窗体以外的其他窗体if (form.Name != "FrmMain"){form.Close();}//MessageBox.Show(form.Name);}
}
  1. 在主窗体左侧点击按钮打开子窗体,直接在按钮的Click事件中调用方法打开就可以了。
private void btn_openHomePage_Click(object sender, EventArgs e)
{openHomePage();
}
  1. 在子窗体中点击按钮打开其他窗体。
    例如我要在气缸界面中点击拉拔一界面按钮,打开拉拔一界面,在拉拔一界面中点击返回,返回到气缸界面。
    在这里插入图片描述
    6.1. 已经在主窗体代码中编写打开各个窗体的代码(第四步),在主窗体代码中编写根据窗体名称打开窗体的方法。如下,非常简洁。
public void OpenWindow(string WindowName)
{//Form window;switch (WindowName){case "FrmHome":openHomePage();break;case "FrmMenu":openMenuPage();break;case "FrmCylinders":openOperatingPage();break;case "FrmMachineInfo":openMachineInfoPage();break;case "气缸输出界面_拉拔一":Open气缸输出界面_拉拔一();break;// 添加更多的窗口名称和对应的窗口类default:// 如果指定的窗口名称无效,可以进行相应的处理return;}
}

6.2. 在子窗体中点击按钮时触发 OpenWindow 事件
下面的代码依旧很简单,在子窗体中获取主窗体,因为主窗体永远不会在子窗体关闭前关闭,所以直接用主窗体的名称获取就行了。

public partial class FrmCylinders : Form
{FrmMain frmMain;public FrmCylinders(){InitializeComponent();GetFrmMain();}private void GetFrmMain(){foreach (Form form in Application.OpenForms){if (form.Name == "FrmMain"){frmMain = (FrmMain)form;}}}//调用打开其他窗体的方法private void btn_Strip1_Click(object sender, EventArgs e){frmMain.OpenWindow("气缸输出界面_拉拔一");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE语法之七:封装

文章目录 一、封装的概念二、访问限定符三、封装扩展之包1. 包的概念2. 导入包中的类3. 自定义包4. 常见的包 四、实现封装五、static成员1. 再谈学生类成员变量2. static修饰成员变量3. static修饰成员方法4. static成员变量初始化 六、代码块1. 代码块概念及其分类2. 普通代码…

香槟过了保质期还能喝吗?

香槟是起泡酒的高级代表&#xff0c;是浪漫和喜庆的化身&#xff0c;它浑身上下都散发着无穷的魅力。那么&#xff0c;这么精贵的葡萄酒有没有保质期&#xff0c;会不会变质呢&#xff1f;云仓酒庄的品牌雷盛红酒分享当然会。一瓶酒的生命离不开它的保存期限&#xff0c;酒的质…

理解Socket

前言 我在去年就学习过Java中Socket的使用&#xff0c;但对于Socket的理解一直都是迷迷糊糊的。看了网上很多关于Socket的介绍&#xff0c;看完还是不太理解到底什么是Socket&#xff0c;还是很迷。直到最近在学习计算机网络&#xff0c;我才对Socket有了一个更深地理解。之前一…

HBuilder X

选择一款编程软件有以下几个好处&#xff1a; &#xff08;1&#xff09;提高效率&#xff1a;编程软件通常强调代码编辑和自动完成&#xff0c;可以帮助程序员更快速、更准确地输入代码。 &#xff08;2&#xff09;降低错误率&#xff1a;编程软件还可以检测代码中的错误&a…

如何提升数据结构方面的算法能力?

谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二分查找替 换线性搜索就能为我们帶来巨大的收益。 (2)安全性&#xff1a;如果你选用了错误的算法&…

设计模式之结构型设计模式(二):工厂模式 抽象工厂模式 建造者模式

工厂模式 Factory 1、什么是工厂模式 工厂模式旨在提供一种统一的接口来创建对象&#xff0c;而将具体的对象实例化的过程延迟到子类或者具体实现中。有助于降低客户端代码与被创建对象之间的耦合度&#xff0c;提高代码的灵活性和可维护性。 定义了一个创建对象的接口&…

【通用】Linux,VSCode,IDEA,Eclipse等资源相对位置

正文 不论是 IDEA、Linux、VSCode、cmd等等吧&#xff0c;都遵循这个规则&#xff1a; 如果以斜杠开头&#xff0c;表示从根开始找&#xff1a; IDEA的根是classpath&#xff08;classpath就是项目被编译后&#xff0c;位于 target下的 classes文件夹&#xff0c;或者位于ta…

软实力篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、专业技能怎么写二、排版注意事项三、其他一些小tips前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、专业技能怎么…

自然语言处理阅读第一弹

Transformer架构 encoder和decoder区别 Embeddings from Language Model (ELMO) 一种基于上下文的预训练模型,用于生成具有语境的词向量。原理讲解ELMO中的几个问题 Bidirectional Encoder Representations from Transformers (BERT) BERT就是原生transformer中的Encoder两…

爬虫akamai案例:DHL国际物流

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、Akamai简介 Akamai是一家提供内容传递网络&#xff08;CDN&#xff09;和云服务的公司。CDN通过将内容分发到全球各地的服…

RK3568全国产化多网口板卡,支持内置UPS模块,支持麒麟翼辉国产系统

信迈XM-3568-01主板采用瑞芯微RK3568四核Cortex-A55 处理器&#xff0c;主频最高可达2.0GHz&#xff0c;效能有大幅提升最高可配8GB内存容量&#xff0c;频率高达1600MHz&#xff1b;支持全链路ECC&#xff0c;让数据更安全可靠配置双千兆自适应RJ45以太网口&#xff0c;并扩展…

带你学C语言~指针(1)

Hello,CSDN的各位家人们&#xff0c;你们好啊&#xff01;今天&#xff0c;小赵要给大家分享的C语言知识是指针&#xff0c;相信不少家人们都或多或少被指针搞得晕头转向&#xff0c;小赵一开始也是&#xff0c;但后来小赵经过不断地努力学习&#xff0c;终于将这里面的知识弄懂…

Pearson、Spearman 相关性分析使用

介绍 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。 用来衡量两个数据集的线性相关程度&#xff0c;仅当一个变量的变化与另一个变量的比例变化相关时&#xff0c;关系才是线性的。 Spearman等级相关系数则衡量分级定序变量之间的相关程度。斯皮尔曼相关系数不…

汽车充电协议OpenV2G的平替cbexigen!!

纵所周知&#xff0c;开源欧规协议 CCS 的 OpenV2G 协议不支持 ISO15118-20:2022 协议&#xff0c;并且软件维护者已经明确不在进行该软件的维护。 前几天在 Github 上冲浪发现了一个宝藏开源项目&#xff0c;完美的实现的 OpenV2G 的 Exidizer 工具的功能&#xff1a;cbexigen…

Centos开机进入grub命令行模式进入不了操作系统

环境&#xff1a;没有linux命令&#xff0c;没有initrd命令&#xff0c;没有init6命令 由于删除了/boot/efi/EFI/centos/grub.cfg &#xff0c;重启服务器后&#xff0c;无法进入原来正常的系统&#xff0c;进入了grub命令行界面 备注&#xff1a;对于centos7/8/openEuler: 如果…

数据结构之排序

目录 ​ 1.常见的排序算法 2.插入排序 直接插入排序 希尔排序 3.交换排序 冒泡排序 快速排序 hoare版本 挖坑法 前后指针法 非递归实现 4.选择排序 直接选择排序 堆排序 5.归并排序 6.排序总结 一起去&#xff0c;更远的远方 1.常见的排序算法 排序&#xff1a;所…

Unity实现GoF23种设计模式

文章目录 Unity实现GoF23种设计模式概要一、创建型模式(Creational Patterns):二、结构型模式(Structural Patterns):三、行为型模式(Behavioral Patterns):Unity实现GoF23种设计模式概要 GoF所提出的23种设计模式主要基于以下面向对象设计原则: 对接口编程而不是对实…

RocketMQ系统性学习-RocketMQ领域模型及Linux下单机安装

MQ 之间的对比 三种常用的 MQ 对比&#xff0c;ActiveMQ、Kafka、RocketMQ 性能方面&#xff1a; 三种 MQ 吞吐量级别为&#xff1a;万&#xff0c;百万&#xff0c;十万消息发送时延&#xff1a;毫秒&#xff0c;毫秒&#xff0c;微秒可用性&#xff1a;主从&#xff0c;分…

PyQt6 QFrame分割线控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

消除非受检警告

在Java中&#xff0c;有一些情况下编译器会生成非受检警告&#xff08;Unchecked Warnings&#xff09;。这些警告通常与泛型、类型转换或原始类型相关。消除这些警告可以提高代码的可读性和安全性。以下是一些常见的非受检警告以及如何消除它们的例子&#xff1a; 1. 泛型类型…