首先声明:在此感谢Dockpanel 实现浮动和多标签窗体解决方案给我提供思路和灵感。本文的形成也多有借鉴,再次表示感谢!在此记录一下Dockpanel框架的搭建过程(主要步骤),以及需要注意的几点。

1. 下载Dockpanel suite。

在sf上能下到最新版本的dll和demo。

2. 构建主窗体(父窗体):FrmMain。

① 新建工程:VehicleMonitorSystem;

② 将WeifenLuo.WinFormsUI.Docking.dll放置当前工程文件夹下,建议:\bin\Debug\WeifenLuo.WinFormsUI.Docking.dll;

③ 在当前工程中,通过解决方案资源管理器添加引用WeifenLuo.WinFormsUI.Docking.dll到当前工程;

④  添加主窗体:FrmMain,并设置主窗体 IsMdiContainer = true;

⑤ 在主窗体中添加dockpanel控件:DockPanelOfFrmMain,并设置dockpanel 的documentstyle :dockPanel.DocumentStyle = DocumentStyle.DockingMdi;

后台代码如下:

[csharp]  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using WeifenLuo.WinFormsUI.Docking;  namespace VehicleMonitorSystem
{  public partial class FrmMain : Form  {          #region 字段  private string m_DockPath = string.Empty;  #endregion  #region 构造函数  public FrmMain()  {  InitializeComponent();  }  #endregion  #region 主窗体加载  private void FrmMain_Load(object sender, EventArgs e)  {  this.DockPanelOfFrmMain.DocumentStyle = DocumentStyle.DockingMdi;  this.m_DockPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");  this.InitDockPanel();  this.StatusBarOfFrmMain.Items.Add("就绪");              }  #endregion  #region DockPanel初始化与配置保存  #region 按照配置文件初始化Dockpanel  private void InitDockPanel()  {  try  {  //根据配置文件动态加载浮动窗体  this.DockPanelOfFrmMain.LoadFromXml(this.m_DockPath, delegate(string persistString)  {  //功能窗体  if (persistString == typeof(FrmFunction).ToString())  {  return FrmFunction.GetInstance();  }  //主框架之外的窗体不显示  return null;  });  }  catch (Exception)  {  //配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体  FrmFunction.GetInstance().Show(this.DockPanelOfFrmMain, AppConfig.ms_FrmFunction);  }  }  #endregion  #region 关闭窗体时保存界面。为了下次打开程序时,浮动窗体的显示位置和关闭时一致,可以在主窗体的frmMain_FormClosing事件中调用:dockPanel.SaveAsXml(this.m_DockPath)  private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)  {  try  {  DockPanelOfFrmMain.SaveAsXml(this.m_DockPath);  }  catch (Exception ex)  {  MessageBox.Show("保存Dockpanel配置文件失败," + ex.Message);  return;  }  }  #endregion     #region 退出  private void 退出EToolStripMenuItem_Click(object sender, EventArgs e)  {  this.Close();  }  #endregion  #region 关于  private void 关于AToolStripMenuItem_Click(object sender, EventArgs e)  {  MessageBox.Show(" DockPanel Suite V2.1.3364.29178 \n\n VehicleMonitorSystem V1.0.0 \n\n Created by 张月华 \n\n E-mail:yichangzyh@163.com \n\n Date:2011-10-10", "车辆监控系统");  }  #endregion  #endregion  }
}  

3. 构建需要浮动显示的窗体:FrmFunction。

① 在当前工程中添加窗体:FrmFunction;(注意:浮动窗体和标签窗体需要继承自DockContent);

② 为了保证在关闭某一浮动窗体之后,再打开时能够在原位置显示,要对浮动窗体处理,处理窗体的DockstateChanged事件,标签窗体dock位置改变,记录到公共类;

后台代码如下:

[csharp]  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;  namespace VehicleMonitorSystem
{  public partial class FrmFunction : DockContent   // 浮动窗体和标签窗体需要继承自DockContent
    {  #region 字段  private static FrmFunction Instance;  #endregion  #region 构造函数  public FrmFunction()  {  InitializeComponent();  }  #endregion          #region 静态实例初始化函数  public static FrmFunction GetInstance()  {  if (Instance == null)  {  Instance = new FrmFunction();  }  return Instance;  }  #endregion  #region 为了保证在关闭某一浮动窗体之后,再打开时能够在原位置显示,要对浮动窗体处理,处理窗体的DockstateChanged事件,标签窗体dock位置改变,记录到公共类  private void FrmFunction_DockStateChanged(object sender, EventArgs e)  {  //关闭时(dockstate为unknown) 不把dockstate保存  if (Instance != null)  {  if (this.DockState == DockState.Unknown || this.DockState == DockState.Hidden)  {  return;  }  AppConfig.ms_FrmFunction = this.DockState;  }  }  #endregion  #region 关闭事件  private void FrmFunction_FormClosed(object sender, FormClosedEventArgs e)  {  Instance = null;  // 否则下次打开时报错,提示“无法访问已释放对象”
        }  #endregion  }
}  

4. 让窗体FrmFunction浮动起来。

①  在主窗体FrmMain中添加菜单栏(或者按钮):视图->功能窗;

② 双击菜单对应选项,添加代码如下:

 
#region 显示功能窗  private void 功能窗ToolStripMenuItem_Click(object sender, EventArgs e)  {  this.ShowFrmFunction();  }     private void ShowFrmFunction()  {  FrmFunction frmFun = FrmFunction.GetInstance();            frmFun.Show(this.DockPanelOfFrmMain, AppConfig.ms_FrmFunction);  this.StatusBarOfFrmMain.Items[0].Text = frmFun.Text;  }
#endregion  

5. 在当前工程中添加类AppConfig。

[csharp]  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WeifenLuo.WinFormsUI.Docking;  namespace VehicleMonitorSystem
{  class AppConfig  {  #region 字段  public static DockState ms_FrmFunction = DockState.DockLeft;   // 功能窗体,左端停靠   #endregion  }
}  

6. 运行,子窗体FrmFunction将在父窗体FrmMain的左端停靠。Enjoy it ~~

值得注意的几点:

A.

Dockpanel suite 是基于配置文件的,其配置文件Dockpanel.config可以放置到指定的位置。在主窗体的load 事件中要做加载配置文件的工作。需要执行配置文件的路径,并使用dockpanel 的LoadFromXml方法加载需要显示的浮动窗体,在initDockpanel 中自定义  装载的哪些浮动窗体。

主窗体的load事件:

 
private void FrmMain_Load(object sender, EventArgs e)  {     ...  this.m_DockPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");  this.InitDockPanel();   ...             }  

InitDockPanel方法:

 
#region 按照配置文件初始化Dockpanel  private void InitDockPanel()  {  try  {  //根据配置文件动态加载浮动窗体  this.DockPanelOfFrmMain.LoadFromXml(this.m_DockPath, delegate(string persistString)  {  //功能窗体  if (persistString == typeof(FrmFunction).ToString())  {  return FrmFunction.GetInstance();  }                      //主框架之外的窗体不显示  return null;  });  }  catch (Exception)  {  // 配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体  // 注:在此加入的特殊处理,来改进Dockpanel 的加载,如果dockpanel.config不存在(不小心删除了),可以按照Appconfig中预定义的dockstate显示。
  FrmFunction.GetInstance().Show(this.DockPanelOfFrmMain, AppConfig.ms_FrmFunction);                  }  }  #endregion  

B.

浮动窗体使用:frmServer.Show(this.dockPanel, dockstate);

标签窗体使用:

dummyDoc.Show(dockPanel);

C.

为了下次打开程序时,浮动窗体的显示位置和关闭时一致,可以在主窗体的frmMain_FormClosing事件中调用:dockPanel.SaveAsXml(this.m_DockPath):

[csharp] view plaincopyprint?
#region 关闭窗体时保存界面。为了下次打开程序时,浮动窗体的显示位置和关闭时一致,可以在主窗体的frmMain_FormClosing事件中调用:dockPanel.SaveAsXml(this.m_DockPath)  private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)  {  try  {  DockPanelOfFrmMain.SaveAsXml(this.m_DockPath);  }  catch (Exception ex)  {  MessageBox.Show("保存Dockpanel配置文件失败," + ex.Message);  return;  }  }  #endregion  

以上几点是搭建基于dockpanel 浮动和多标签窗体系统的主要步骤

转载于:https://www.cnblogs.com/endv/articles/4199522.html

C#实现浮动和多标签窗体解决方案---使用Dockpanel相关推荐

  1. Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)

    Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符) 目录

  2. IE6,IE7和8浏览器兼容HTML5标签的解决方案

    html5大行其道的时代已经到来.如果你还在等待浏览器兼容,说明你已经与web脱节几条街了.当然,这得益于移动客户端的蓬勃发展.如果还在纠 结于,是否应该掌握html5和css3技术时,请狠狠的抽自己 ...

  3. 关于使用vue-quill-editor出现p标签的解决方案

    最近在写自己的个人博客项目,由于需要发表文章,因此需要引入富文本编辑器,关于相关的导入细节网上有很多. 这次主要说明使用vue-quill-editor的时候出现的一个"bug", ...

  4. ios转换html标签,iOS html标签解析解决方案

    由于项目是基于b/s结构,因为在pc端上是没有客户端这概念只有浏览器,而对于web与移动端的关系,实际上还是类似于C/S结构,因此web端与web端的通信是通过发送HTML5标签来实现,常规的做法中p ...

  5. 2022-03-03 html网页布局练习(二):使用float浮动+html5新增标签进行网页布局

    设计图 https://s3.bmp.ovh/imgs/2023/02/10/f04eca2ec8533891.jpg 页面构成和思路 页面由头部header+轮拨图banner+选项卡片sectio ...

  6. 清除浮动造成的影响的解决方案总结

    1.将设置float的元素的父元素也设置float. 缺点:很有可能不符合情况要求 2.设置父元素的position为absolute,前提是父元素的父元素并没有设置position:relative ...

  7. Flutter中富文件标签的解决方案

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. [x1]点击查看提示 [x2]各种系列的教程 一个程序员的修炼日记 在实际业务开发中,时常会有这种一段Html格式的标签,看下图的情况 ...

  8. html5的设置图片来回浮动,图片浮动的怪异问题和解决方案

    当页面中两张图片都向同一个方向浮动,并且他们的距离很近时,会出现如右图的情况,我们称为"图片浮动的怪异问题".在我们的例子中,我们使用同一个class来为一组图片添加样式, 例如使 ...

  9. html5ul消除圆点,overflow清楚浮动 + 去掉li标签的小圆点

    原文链接:http://blog.163.com/qqabc20082006@126/blog/static/22928525201031211212955/ 测试用例: 无标题文档 #wrapper ...

最新文章

  1. linux 增量备份镜像,【备份与恢复】合并增量备份与映像副本
  2. manager的烦恼
  3. 文巾解题 20有效的括号
  4. 如何联机调试和发布程序(99$)
  5. 休眠身份,序列和表(序列)生成器
  6. python数据图形化—— matplotlib 基础应用
  7. java注解返回不同消息,SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解...
  8. Percona XtraBackup 数据恢复工具安装 ubuntu 16.04
  9. mongodb 远程连接
  10. 看着自己参与的自测,我简直要疯了…………
  11. BizTalk database lookup funcatoid DbConnectionString 设定问题有解了
  12. OpenGL超级宝典(第7版)笔记10 片段着色器 清单3.10-3.12
  13. onselect与onselectstart 禁止选中
  14. SaaS服务应用集成和生态该何去何从
  15. 华中科技大学计算机免试,华中科技大学计算机学院2015年接收推荐免试研究生待录取结果公示...
  16. 联想计算机如何进bois,联想电脑怎么进入bios 联想进入bios方法【图文】
  17. 种子点生长算法(上)——二维种子点生长
  18. 简简单单说外键和级联
  19. Stream流中常用的方法
  20. 2016级计算机C++助教工作(12) 第二次上机解题报告

热门文章

  1. antimalware可以关闭吗_EMUI这几个功能一定要关闭 不然手机会越来越卡
  2. Hi3798M V200 SDK文档介绍
  3. python联科_联科集团携手阿里云发布科研混合云平台 共建科研教育新生态
  4. debian查询端口进程_centos linux系统配置查询
  5. 我有一个域名_一个域名可以绑定几个网站?域名解析多少子域名?
  6. 最详细的Mask R-CNN论文笔记
  7. 软考网络管理员学习笔记6之第六章互联网技术
  8. AI人才大战硝烟袅袅,缺口该如何填补?
  9. 软考信息安全工程师备考笔记8:第八章应用系统安全工程备考要点
  10. android LinearLayout和RelativeLayout实现精确布局