博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现浮动和多标签窗体解决方案---使用Dockpanel
阅读量:5875 次
发布时间:2019-06-19

本文共 8394 字,大约阅读时间需要 27 分钟。

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

 

1. 下载Dockpanel suite。

    。

 

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] 
 
#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 浮动和多标签窗体系统的主要步骤 

你可能感兴趣的文章
转载:我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)
查看>>
提示框
查看>>
HDOJ1233 畅通工程之一(最小生成树-Kruscal)
查看>>
14Spring_AOP编程(AspectJ)_环绕通知
查看>>
PHP之打开文件
查看>>
iOS - OC SQLite 数据库存储
查看>>
PHP-mysqllib和mysqlnd
查看>>
Redis常用命令
查看>>
NeHe OpenGL教程 第三十五课:播放AVI
查看>>
Linux下ping命令、traceroute命令、tracert命令的使用
查看>>
js replace,正则截取字符串内容
查看>>
socket
查看>>
Highcharts使用表格数据绘制图表
查看>>
Thinkphp5笔记三:创建基类
查看>>
hdu5373
查看>>
4.单链表的创建和建立
查看>>
Android 好看的搜索界面,大赞Animation
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
[转]动态加载javascript
查看>>
【协议】5、gossip 协议
查看>>