首先声明:在此感谢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;
后台代码如下:
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位置改变,记录到公共类;
后台代码如下:
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。
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):
#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 浮动和多标签窗体系统的主要步骤和注意事项,如有纰漏,欢迎指教。谢谢!
注:本文原创,欢迎转载!请注明出处,并附本文链接!
作 者:zyh
E-mail: yichangzyh@163.com
分享到:
相关推荐
首先声明:在此感谢Dockpanel 实现浮动和多标签窗体解决方案给我提供思路和灵感。本文的形成也多有借鉴,再次表示感谢!在此记录一下Dockpanel框架的搭建过程(主要步骤),以及需要注意的几点。
做桌面客户端的时候有时需要实现...这个功能是不太好实现的,需要一定的方法,其中使用DockPanel是相对简单直接的实现。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125550292
一个很不错的界面组件,可以实现像VS一样的多文档界面,并且是开源的,目前是最新版本 2.5 。欢迎转发传播,非本人原创。版权归原作者所有,请遵循文档中的License
基于Dock Panel 控件的 Windows UI 编程,主要是UI的相关知识,值得借鉴!!
dockpanelsuite-master,开源的dock控件,实现窗体的拖放布局。
最新版C# dockpanel文件源代码,可实现多窗口显示,多窗口操作,非常 不错的开源软件最新版C# dockpanel文件源代码,可实现多窗口显示,多窗口操作,非常 不错的开源软件
这个组件不错,可以实现像VS一样的多文档界面,并且是开源的(.net1.1\2.0) 在此感谢作者
该项目代码中介绍如何判断窗体是否重复打开,如何使用DockPanel创建浮动,以及Document类型的窗体
一个基于C#实现的用于WPF的DockPanel Splitter Control停靠分割条控件源码及例子程序
DockPanel支持让元素简单地停靠在整个面板的某一条边上,然后拉伸元素以填满全部宽度或高度。它也支持让一个元素填充其他已停靠元素没有占用的剩余空间。包含了控件及相关类
C#的经典开源项目,实现窗体的停靠方式,例如Visual Studio的属性窗口,工具箱窗口等等
这是仿制VS界面开发的界面库,功能非常的丰富,导航栏和界面布局非常的美观。
一个开源的c#项目的源代码。 可以利用它实现和vs2005一样的dockpanel。 很不错的的一个DockPenel库
C#+dockpanel
包括了WeifenLuo的最新源代码,示例程序以及WeifenLuo.WinFormsUI.Docking.dll
DockPanel组件使用步骤说明: 1、建立一个WinForm工程,默认生成了一个WinForm窗体Form1,并改名为FormMain。 2、在"解决方案管理器"中,点击"引用",弹右键,添加"引用",点击"浏览"页面,找到"WeifenLuo.WinForms...
基于C#下的Winform的开源插件Dockpanel,可以自由组合界面,更加高效的完成页面的使用,提高页面完整程度和美观度
也就是那个可以实现像VS那样多窗口停靠的WeifenLuo.WinFormsUI.Docking!包含类库的源代码和示例,新增VS2012和VS2013两个主题,现在共4个主题。 要想看示例,请解压后,直接打开WinFormsUI.Docking.sln,然后打开...
DockPanel使用方法,窗体浮动,窗体拖拉,Vs 窗体效果
C# 利用DockPanel实现类似VS 2008的应用程序界面