你的位置:首页 > 软件开发 > ASP.net > 分享在winform下实现左右布局多窗口界面

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

发布时间:2016-01-04 17:00:06
在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口界面。我这里说的多窗口是指一个父窗口包含多个子窗口,在winform中实现这种效 ...

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

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

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

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

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

请看我上图红色标注的地方,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();    }  }

简要说明:

1.在窗口构造函数中动态的将IsMdiContainer设为true,当然也可以设计视图中设置;

2.编写一个显示写子窗口的方法,方法中需注意的地方:childForm.MdiParent = this;childForm.Parent = splitContainer1.Panel2,意思是:将当前窗口作为子窗口的父窗口,同时将Panel2指定为子窗口的父对象,这样就能实现子窗口在Panel2中打开了。

第二个功能:在WINDOWS菜单项下显示已打开的子窗口列表,这里实现就没有像文章一开始介绍的那样简单,使用那个方法是无效的,需要我们来自行实现,稍微有点复杂,但如果明白其实现原理,也就简单明白了。

实现思路:当childForm加载到Panel2时,会触发Panel2.ControlAdded事件,当childForm被关闭时,会触发Panel2.ControlRemoved事件,我们可以统一订阅这两个事件,当childForm加载时,那么就在WINDOWS菜单项下增加一个菜单项,反之则移除该菜单项,实现代码如下:

this.splitContainer1.Panel2.ControlAdded += Panel2_ControlChanged;this.splitContainer1.Panel2.ControlRemoved += Panel2_ControlChanged;void Panel2_ControlChanged(object sender, ControlEventArgs e)    {      var frm = e.Control as Form;      string menuName = "menu_" + frm.Name;      bool exists = this.splitContainer1.Panel2.Controls.Contains(frm);      if (exists)      {        var menuItem = GetMenuItem(menuName);        if (menuItem != null)        {          menuItem.Checked = true;          frm.BringToFront();          frm.Focus();        }        else        {          windowsToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem() { Text = frm.Text, Name = menuName, Tag = frm, Checked = true });        }      }      else      {        var menuItem = GetMenuItem(menuName);        if (menuItem != null)        {          windowsToolStripMenuItem.DropDownItems.Remove(menuItem);          menuItem.Dispose();        }      }    }    private ToolStripMenuItem GetMenuItem(string menuName)    {      var menuItems = windowsToolStripMenuItem.DropDownItems.Cast<ToolStripMenuItem>();      menuItems.ToList().ForEach(m => m.Checked = false);      return menuItems.Where(m => m.Name == menuName).SingleOrDefault();    }

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

关键词:winform

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录