打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#实现浮动和多标签窗体解决方案

首先声明:在此感谢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;

      后台代码如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.IO;  
  10. using WeifenLuo.WinFormsUI.Docking;  
  11.   
  12. namespace VehicleMonitorSystem  
  13. {  
  14.     public partial class FrmMain : Form  
  15.     {          
  16.  
  17.         #region 字段  
  18.         private string m_DockPath = string.Empty;  
  19.         #endregion  
  20.  
  21.         #region 构造函数  
  22.         public FrmMain()  
  23.         {  
  24.             InitializeComponent();  
  25.         }  
  26.         #endregion  
  27.  
  28.         #region 主窗体加载  
  29.         private void FrmMain_Load(object sender, EventArgs e)  
  30.         {  
  31.             this.DockPanelOfFrmMain.DocumentStyle = DocumentStyle.DockingMdi;  
  32.             this.m_DockPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");  
  33.             this.InitDockPanel();  
  34.             this.StatusBarOfFrmMain.Items.Add("就绪");              
  35.         }  
  36.         #endregion  
  37.  
  38.         #region DockPanel初始化与配置保存  
  39.  
  40.         #region 按照配置文件初始化Dockpanel  
  41.         private void InitDockPanel()  
  42.         {  
  43.             try  
  44.             {  
  45.                 //根据配置文件动态加载浮动窗体  
  46.                 this.DockPanelOfFrmMain.LoadFromXml(this.m_DockPath, delegate(string persistString)  
  47.                 {  
  48.                     //功能窗体  
  49.                     if (persistString == typeof(FrmFunction).ToString())  
  50.                     {  
  51.                         return FrmFunction.GetInstance();  
  52.                     }  
  53.                                    
  54.                     //主框架之外的窗体不显示  
  55.                     return null;  
  56.                 });  
  57.             }  
  58.             catch (Exception)  
  59.             {  
  60.                 //配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体  
  61.                 FrmFunction.GetInstance().Show(this.DockPanelOfFrmMain, AppConfig.ms_FrmFunction);  
  62.                   
  63.             }  
  64.         }  
  65.         #endregion  
  66.  
  67.         #region 关闭窗体时保存界面。为了下次打开程序时,浮动窗体的显示位置和关闭时一致,可以在主窗体的frmMain_FormClosing事件中调用:dockPanel.SaveAsXml(this.m_DockPath)  
  68.   
  69.         private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)  
  70.         {  
  71.             try  
  72.             {  
  73.                 DockPanelOfFrmMain.SaveAsXml(this.m_DockPath);  
  74.             }  
  75.             catch (Exception ex)  
  76.             {  
  77.                 MessageBox.Show("保存Dockpanel配置文件失败," + ex.Message);  
  78.                 return;  
  79.             }  
  80.         }  
  81.  
  82.         #endregion     
  83.  
  84.         #region 退出  
  85.         private void 退出EToolStripMenuItem_Click(object sender, EventArgs e)  
  86.         {  
  87.             this.Close();  
  88.         }  
  89.         #endregion  
  90.  
  91.         #region 关于  
  92.         private void 关于AToolStripMenuItem_Click(object sender, EventArgs e)  
  93.         {  
  94.             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", "车辆监控系统");  
  95.         }  
  96.         #endregion  
  97.  
  98.          
  99.  
  100.  
  101.  
  102.         #endregion  
  103.   
  104.   
  105.     }  
  106. }  

 

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

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

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

    后台代码如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using WeifenLuo.WinFormsUI.Docking;  
  10.   
  11. namespace VehicleMonitorSystem  
  12. {  
  13.     public partial class FrmFunction : DockContent   // 浮动窗体和标签窗体需要继承自DockContent  
  14.     {  
  15.         
  16.         #region 字段  
  17.         private static FrmFunction Instance;  
  18.         #endregion  
  19.  
  20.         #region 构造函数  
  21.         public FrmFunction()  
  22.         {  
  23.             InitializeComponent();  
  24.         }  
  25.         #endregion          
  26.  
  27.         #region 静态实例初始化函数  
  28.         public static FrmFunction GetInstance()  
  29.         {  
  30.             if (Instance == null)  
  31.             {  
  32.                 Instance = new FrmFunction();  
  33.             }  
  34.             return Instance;  
  35.         }  
  36.         #endregion  
  37.  
  38.         #region 为了保证在关闭某一浮动窗体之后,再打开时能够在原位置显示,要对浮动窗体处理,处理窗体的DockstateChanged事件,标签窗体dock位置改变,记录到公共类  
  39.   
  40.         private void FrmFunction_DockStateChanged(object sender, EventArgs e)  
  41.         {  
  42.             //关闭时(dockstate为unknown) 不把dockstate保存  
  43.             if (Instance != null)  
  44.             {  
  45.                 if (this.DockState == DockState.Unknown || this.DockState == DockState.Hidden)  
  46.                 {  
  47.                     return;  
  48.                 }  
  49.                 AppConfig.ms_FrmFunction = this.DockState;  
  50.             }  
  51.         }  
  52.         #endregion  
  53.  
  54.         #region 关闭事件  
  55.         private void FrmFunction_FormClosed(object sender, FormClosedEventArgs e)  
  56.         {  
  57.             Instance = null;  // 否则下次打开时报错,提示“无法访问已释放对象”  
  58.         }  
  59.         #endregion  
  60.   
  61.     }  
  62. }  

 

4. 让窗体FrmFunction浮动起来。

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

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

  1. #region 显示功能窗  
  2.   
  3.         private void 功能窗ToolStripMenuItem_Click(object sender, EventArgs e)  
  4.         {  
  5.             this.ShowFrmFunction();  
  6.         }     
  7.   
  8.         private void ShowFrmFunction()  
  9.         {  
  10.               
  11.             FrmFunction frmFun = FrmFunction.GetInstance();            
  12.             frmFun.Show(this.DockPanelOfFrmMain, AppConfig.ms_FrmFunction);  
  13.             this.StatusBarOfFrmMain.Items[0].Text = frmFun.Text;  
  14.         }  
  15. #endregion  


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

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using WeifenLuo.WinFormsUI.Docking;  
  6.   
  7. namespace VehicleMonitorSystem  
  8. {  
  9.     class AppConfig  
  10.     {  
  11.         #region 字段  
  12.   
  13.         public static DockState ms_FrmFunction = DockState.DockLeft;   // 功能窗体,左端停靠   
  14.          
  15.         #endregion  
  16.     }  
  17. }  


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

 

值得注意的几点:

A. 

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

主窗体的load事件:

  1. private void FrmMain_Load(object sender, EventArgs e)  
  2.           
  3. {     
  4.    ...  
  5.            
  6.    this.m_DockPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");  
  7.    this.InitDockPanel();   
  8.   
  9.    ...             
  10.           
  11. }  

InitDockPanel方法:

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

 

B.

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

     标签窗体使用:dummyDoc.Show(dockPanel);

 

C.

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

  1. #region 关闭窗体时保存界面。为了下次打开程序时,浮动窗体的显示位置和关闭时一致,可以在主窗体的frmMain_FormClosing事件中调用:dockPanel.SaveAsXml(this.m_DockPath)  
  2.   
  3.         private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)  
  4.         {  
  5.             try  
  6.             {  
  7.                 DockPanelOfFrmMain.SaveAsXml(this.m_DockPath);  
  8.             }  
  9.             catch (Exception ex)  
  10.             {  
  11.                 MessageBox.Show("保存Dockpanel配置文件失败," + ex.Message);  
  12.                 return;  
  13.             }  
  14.         }  
  15.  
  16. #endregion  

 

以上几点是搭建基于dockpanel 浮动和多标签窗体系统的主要步骤和注意事项,如有纰漏,欢迎指教。谢谢!

 

注:本文原创,欢迎转载!请注明出处,并附本文链接!
作    者:zyh

E-mail: yichangzyh@163.com



 

   


 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
利用DockPanel与C#制作窗体浮动和停靠(vs2010)
C#窗体自动停靠—如何使用weifenluo.dll(by?Kiseigo)
C# 开源控件DockPanel 使用心得
C# MDI窗体合并子窗体菜单和合并工具栏
携手Delphi,保护我们的.NET程序
登录成功后关闭登录窗体显示主窗体的三种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服