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

一、介绍

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

二、实现
  1. 首先创建项目,在主窗体中放置一个 SplitContainer 进行左右布局,左侧放按钮,右侧用于显示窗体。在这里插入图片描述
  2. 创建Size和上图中 Panel2 一样的子窗体,把 BorderStyle 设置为 none。
    在这里插入图片描述
  3. 在主窗体编写打开特定窗体的方法
    如下是打开 frmHome 子窗体的方法,打开其他子窗体的方法除了名字完全一样。
private void openHomePage()
{
    CloseOtherForms();//先关闭除主窗体以外的其他窗体,即关闭所有子窗体
    FrmHome frmHome = new FrmHome();//实例化frmHome子窗体
    frmHome.Dock = System.Windows.Forms.DockStyle.Fill;//设置Dock为Fill使子窗体占满splitContainer1.Panel2
    frmHome.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. 在子窗体中点击按钮打开其他窗体。
    例如我要在气缸界面中点击拉拔一界面按钮,打开拉拔一界面,在拉拔一界面中点击返回,返回到气缸界面。
    在这里插入图片描述
    5.1. 已经在主窗体代码中编写打开各个窗体的代码(第3步),在主窗体代码中编写根据窗体名称打开窗体的方法。如下,非常简洁。
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("气缸输出界面_拉拔一");
    }
}
  • 18
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值