分享在winform下实现左右布局多窗口界面

本文介绍了如何在Winform应用中实现左右布局的多窗口界面,通过SplitContainer控件和MdiContainer属性,动态调整左右占比,并展示了在MenuStrip菜单中显示和切换子窗口的方法。详细讲解了ControlAdded和ControlRemoved事件的使用,以及如何在窗口Z顺序改变时同步更新菜单选中状态。
摘要由CSDN通过智能技术生成

在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口界面。

我这里说的多窗口是指一个父窗口包含多个子窗口,在winform中实现这种效果很简单,即将某个窗口的IsMdiContainer设为true,然后将其它子窗口的MdiParent设为其父窗口对象即可,这样就完成了一个多窗口界面,效果如下:

点击NEW新打开一个窗口,其效果如下:

请看我上图红色标注的地方,Windows菜单项下面显示的是当前所有已打开的子窗口,点击某个菜单,即可快速切换到其它窗口,若关闭某个子窗口,与之相对应的菜单项也会自动被移除,实现这个功能也很简单,只需要将菜单的MdiWindowListItem属性设为需要显示活动窗口列表的菜单项即可,如:this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;

上述示例完整的实现代码如下:

    public partial class FormMdi : Form
    {
        private int formCount = 0;

        public FormMdi()
        {
            InitializeComponent();
            this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;
        }

        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowChildForm<FormChild>();
        }


        private void ShowChildForm<TForm>() where TForm : Form, new()
        {
            TForm childForm = new TForm();
            childForm.Name = "frm" + Guid.NewGuid().ToString("N");
            childForm.Text = string.Format("Child Form -{0}", ++formCount);
            childForm.MdiParent = this;
            childForm.WindowState = FormWindowState.Maximized;
            childForm.Show();
        }
    }

相信实现上面这部份功能一般用过winform的人都会操作,我这里就当是复习顺便给新手一个参考,同时也为下面要实现的左右布局功能做一个铺垫吧。

 要实现左右布局,并且能够支持可动态调整左右占比的功能,非SplitContainer控件莫属了,如果不了解该控件用法请自行在网上查找相关资料,我这里就不作说明,如果要显示WINDOWS已打开的子窗口情况,同样也需要用到MenuStrip控件,

最终设计的主窗口(FormMain)效果如下:

我这里因为只是演示,所以菜单控件上我只添加了两个菜单项,分别为:WINDOWS,用于显示WINDOWS已打开的子窗口列表,NEW,用于打开一个子窗口;SplitContainer控件全部采用默认的,没有放置任何控件在其中,如果用在正式系统中,一般左边Panel1中会放置一个树形菜单,右边Panel2中保持空即可,因为这个是用来作为子窗口的容器。

 控件层次结构如下图示:

界面设计好了,下面就实现最重要的两个功能。

第一个功能:在右边Panel2中显示子窗口,实现代码如下:

public FormMain()
       {
            this.IsMdiContainer = true;
        }

private void ShowChildForm<TForm>() where TForm : Form, new()
        {
            TForm childForm = new TForm();
            childForm.Name = "frm" + Guid.NewGuid().ToString("N");
            childForm.Text = string.Format("Child Form -{0}", ++formCount);
            childForm.MdiParent = this;
            childForm.Parent = splitContainer1.P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值