C# 开源控件DockPanel 使用心得(重要)

DockPanel中提供了几个可用的类,重要的有两个:DockPanel和DockContent。

DockPanel是从panel继承出来的,用于提供可浮动的dock的子窗口进行浮动和dock的场所, DockContent是从form类中继承出来的,用于提供可浮动的窗口基类.就是说: DockContent对象可以在DockPanel对象中任意贴边,浮动, TAB化等。

WeifenLuo.WinFormsUI.Docking.dll的使用方法:

1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1;

2.引用—>添加引用—>浏览—>WeifenLuo.WinFormsUI.Docking.dll,最好是先把WeifenLuo.WinFormsUI.Docking.dll拷贝到项目目录下面,方便以后创建安装文件;

3.设置窗体(Form1)属性IsMdiContainer为True;

4.工具箱—>右键—>选择项—>.net组件—>浏览—>WeifenLuo.WinFormsUI.Docking.dll—>在工具箱出现dockPanel;

5.将DockPanel拖到窗体Form1上,设置Dock属性,我设置的是:Fill;

6.新建一个WinForm窗体,如:数据集信息左侧;

7.设置JReductBtree压缩树类继承DockContent,public partial class 数据集信息左侧 : DockContent

8.在JReductBtree压缩树类中添加using WeifenLuo.WinFormsUI.Docking;

9.在主窗体Form1中显示停靠窗体,代码如下:


public void MainWindow_Load(object sender, EventArgs e)
        {
 
            数据集信息左侧 tingkaoLeftWindow = new 数据集信息左侧();
            tingkaoLeftWindow.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft);
 
            数据集内容 shujujiLoad = new 数据集内容();
            shujujiLoad.Show(this.dockPanel1);
        }

说明:


tingkaoLeftWindow.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft);表示打开主窗体的时候 tingkaoLeftWindow 在主窗体的左边显示;
shujujiLoad.Show(this.dockPanel1);表示 shujujiLoad 作为标签页显示。

运行后的样式如下图:


--------------------- 
作者:caiandyong 
来源:CSDN 
原文:https://blog.csdn.net/caiandyong/article/details/50539677 
版权声明:本文为博主原创文章,转载请附上博文链接!

一、前言

最近使用Winform 做项目,发现Winform 非常好用,特别是之前有个客户定制需要涉及UI的,用VC++ 不是一般的难搞,后来考虑过以前玩过Winform ,修改窗体和控件的颜色都非常方便,因此果断直接上。

之前在使用VC++ 的MDI风格,自己搭了一个多窗体视图切换Demo,虽说好用,但是有一个Bug 却一直解决不了,因此,做了两个项目后,就不再使用了。

后面使用C#做项目的时候,由于需要一系列型号的共用一个软件,我想要是Winform的pandel 有Dock 的风格就方便多了。于是,百度一下,发现果然有,就是开源控件“DockPanel”

这个开源项目不是一般的好用,因此,这篇也是记录和总结一下,自己使用这个控件过程。

二、DockPanel使用

1、介绍

weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠、拖拽等功能。

控件官方下载地址:http://sourceforge.net/projects/dockpanelsuite/  

2、使用环境  Visual Studio 2010

3、使用方法

(1)新建解决方式,Windows 窗体应用程序

(2)修改WinForm窗体属性,设置其为MDI窗体(多文档窗体)如图:

(3)将WeifenLuo.WinFormsUI.Docking.dll 拷贝到工程目录,的bin 目录下Debug 和 Release 文件夹中。 

(4)解决方案管理器 --> 引用 --> 右键点击添加引用 --> 点击浏览 --> Debug 和 Release 文件夹 -->

选择WeifenLuo.WinFormsUI.Docking.dll --> 点击确定      如图:

                          


(5)工具箱-->选择项...-->.Net Framework组件-->浏览-->WeifenLuo.WinFormsUI.Docking.dll

如图1:

图2:


(6)拖动工具箱中的DockPanel控件到MainForm窗体,拖动时如出现如下错误:

出现这个问题的原因是,建立工程时,目标框架选择的是.Net FrameWork 4 Profile。

解决问题的方式是将在工程属性中,修改目标框架为 .Net FrameWork 4.

(7) 在主窗体放入一个dockpanel 之后,新建一个子窗体并修改其代码中修改窗体继承于DockContent,如下图:


using WeifenLuo.WinFormsUI.Docking;
namespace DockPanel_Test
{
    public partial class Form2 : DockContent
    {     
     public Form2()
        {
            InitializeComponent();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
        }
    }
}

(8)在主窗体中Load 方法中添加如下代码:
 Form2 form2 = new Form2();
           
            form2.Show(dockPanel1);
            form2.DockState = DockState.DockLeft;   //初始化子窗体显示在左边
编译,运行如下图,可以实现类似VC++ 中MDI 风格


可以增加多几个窗体,实现都视图操作。

三、使用总结

1、子窗体一般使用单例模式,这样子资源可以重复利用;

具体讲子窗体代码修改如下:


        private static Form2 mInstance;
        private static mDockState;
 
        private Form2()             //私有构造方法
        {
            InitializeComponent();
        }
 
        private void Form2_Load(object sender, EventArgs e)
        {
 
        }
 
        #region 静态实例初始化函数
        public static Form2 GetInstance()
        {
            if (mInstance == null)
            {
                mInstance = new Form2();
            }
            return mInstance;
        }
        #endregion  
 
 
        #region 为了保证在关闭某一浮动窗体之后,再打开时能够在原位置显示,要对浮动窗体处理,处理窗体的DockstateChanged事件,标签窗体dock位置改变,记录到公共类  
  
        private void FrmFunction_DockStateChanged(object sender, EventArgs e)  
        {  
            //关闭时(dockstate为unknown) 不把dockstate保存  
            if (mInstance != null)  
            {  
                if (this.DockState == DockState.Unknown || this.DockState == DockState.Hidden)  
                {  
                    return;  
                }  
 
                mDockState = this.DockState;  
            }  
        }  
        #endregion  
 
        #region 关闭事件  
        private void FrmFunction_FormClosed(object sender, FormClosedEventArgs e)  
        {  
            mInstance = null;  // 否则下次打开时报错,提示“无法访问已释放对象”  
        }  
        #endregion  
  
    }


这样子就可以实现资源重复利用。


参考文章:

http://blog.csdn.net/zhangyuehua123/article/details/6861401
--------------------- 
作者:gd6321374 
来源:CSDN 
原文:https://blog.csdn.net/gd6321374/article/details/78059501 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/Sayesan/article/details/84585270