DockPanel的使用

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

2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。

3.设置Form1窗体属性IsMdiContainer:True。

4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll—>在工具箱出现dockPanel。

( 下载地址:http://sourceforge.net/projects/dockpanelsuite/)

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

停靠窗体:

1.新建一个WinForm窗体Form2。

2.在代码中修改窗体继承于DockContent。

using WeifenLuo.WinFormsUI.Docking;

public partial class Form2 : DockContent

3.在主窗体Form1中显示停靠窗体。

private void Form1_Load(object sender, EventArgs e)

{

  Form2 form2 = new Form2();

  form2.Show(this.dockPanel1);

}

如果dockPanel嵌套在另1个容器控件上(如:panel),将dockPanel属性DocumentStyle设置为:

DockingWindow:都显示为标签窗体

DockingSdi:主窗体下只打开一个子窗体时是不以标签窗体的模式展现的,当子窗体的个数>1时才展示为标签窗体

在使用DockPanel时 需要注意的几个小问题

第一个:

使用过DockPanel的人,都有可能会遇到这样一个错误:

Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content.

翻译过来的意思大致是:无效的内容: 如果没有一个可见的内容,ActiveContent必须是可见的内容或空。

具体是什么原因,大家可以相互探讨下。下面我说说出现这个问题的几种情况

代码中的this关键字代表的就是Dockpanel所在的窗体为Form1

1)、当Dockpanel的DocumentStyle不为DockingMdi时,以下代码会出现这个问题

Frm_A frmA = null;
       //判断子窗体中是否已经存在在DockPanel中
       foreach (DockContent frm in this.dockPanel1.Contents)
        {
             if (frm is Frm_A)
              {
                    frm.Activate();     //激活子窗体
                    return;
              }
            }

frmA = new Frm_A();
            frmA.MdiParent = this;
            frmA.Show(this.dockPanel1);

解决方案:看你设置Dockpanel的DocumnetStyle是否为DockingMdi。大家也可以试试其他几种方式(DockingWindow,DockingSdi,SystemMdi)

2)、设置了Dockpanel的DocumentStyle不为DockingMdi时,如果你想要设置窗体Frm_B为左边浮动窗体,需要设置窗体Frm_B的DockAreas为且仅为DockLeft,如果想要实现其他功能可自行去设置其他属性信息,现在请看下面代码

Frm_B frmB = null;
            //判断子窗体中是否已经存在在DockPanel中
            foreach (DockContent frm in this.dockPanel1.Contents)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();     //激活子窗体
                    return;
                }
            }

frmB = new Frm_B();
            //frmB.MdiParent = this;
            frmB.Show(this.dockPanel1,DockState.DockLeft);

注意,如果你在你的代码中加了红色注释的代码,那么程序运行时 也会报上面的那个错

解决方案:注释红色的代码。

原因:(个人理解)frmB.Show(this.dockPanel1,DockState.DockLeft);这句代码其实就设置了frmB只停靠在DockPanel左边,此时的frmB是不属于MDI子窗体的,所以一旦你加入红色的代码,程序就会报错。

第二个:

拖动、停靠、固定子窗体(显示在Dockpanel中)

拖动:如果你想使你的子窗体可以任意拖动,那么你在设置子窗体的DockAreas属性时,保持默认值,不要修改。

停靠:首先你需设置DockAreas的位置,可以停靠在左、右、下等,也可以通过程序代码控制,参考上面代码。

固定:只需设置你窗体的DockAreas为Document就行了

第三个:

子窗体和Contents的判断

很多时候你需要判断Dockpanel中存在多少个子窗体或Contents,请参考下面代码:

foreach(Form in this.MdiChildren)

{

//这样判断时,停靠的窗体是不会计算在内的

}

foreach (DockContent frm in this.dockPanel1.Contents)
 {

//这样设置后,所有的继承与DockContent的窗体都会被计算在内的

}

第四个:

寻找主窗体、动态显示子窗体

参考图:

实现的功能:这里我们需要实现,右键点击A窗体,通过右键菜单来显示窗体B。

//主窗体的对象
  Form1 form1;

private void showB_Click(object senders, EventArgs e)
 {

GetFrmMain();  //通过此函数来获取form1

foreach (Form frm in form1.MdiChildren)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();
                    return;
                }
            }

Frm_B frmB = new Frm_B(this);
            frmB.MdiParent = form1;
            frmB.Show(form1.dockPanel1);

}

private void GetFrmMain()

{

if (this.Parent.Parent.Parent.Parent != null)
                {
                    form1 = (Form1)this.Parent.Parent.Parent.Parent;
                }
                else
                {
                    form1 = (Form1)this.Parent.Parent.Parent;
                }

}

现在是在A窗体中,this关键字已经代码的不是主窗体了,那么这里我们就需要获取主窗体对象

当A窗体停靠时,需要this.Parent.Parent.Parent.Parent(四个)

不停靠时,只需要三个this.Parent.Parent.Parent

调试代码发现:停靠时

this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockWindow, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1

不停靠时:

this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel+AutoHideWindowControl, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1

四个小问题,也算不上技巧,在开发中可能会遇到,忘大家相互探讨,共同进步。

DockPanel的使用与技巧的更多相关文章

  1. WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心

    原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...

  2. WPF界面设计技巧(10)-样式的继承

    原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...

  3. WPF界面设计技巧(9)—使用UI自动化布局

    原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...

  4. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  5. 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

    记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...

  6. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  7. 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

    如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...

  8. 15个关于Chrome的开发必备小技巧[译]

    谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...

  9. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

随机推荐

  1. Codeforces 371B Fox Dividing Cheese(简单数论)

    题目链接 Fox Dividing Cheese 思路:求出两个数a和b的最大公约数g,然后求出a/g,b/g,分别记为c和d. 然后考虑c和d,若c或d中存在不为2,3,5的质因子,则直接输出-1( ...

  2. Codeforces 583 DIV2 Asphalting Roads 模拟

    原题链接:http://codeforces.com/problemset/problem/583/A 题意: 很迷很迷,表示没看懂..但是你看样例就秒懂了 题解: 照着样例模拟就好 代码: #inc ...

  3. java 两个int类型的数据相除并输出百分号保留两位有效数字

    java代码: public void IntA(int a , int b){ //首先判断分母不能为0 if(b!=0){ folat num = (float) a*100/b; Decimal ...

  4. Python 集成开发环境(IDE)

      DiscoverSDK网站进行了一次调查 - 什么是最好的Python IDE,这里是调查的结果 ​​​Python是一种非常流行的开源编程语言.得益于无尽的模块选项,Python今天广泛用于脚本 ...

  5. sql server book

    http://www.sqlpassion.at/blog/ http://www.sqlservercentral.com/Books/

  6. 这算是CSS的bug吗?

    移动端web开发越来越火,同时移动端适配也是一个很让人头疼的事情,你不能让一个同样大小的元素在不同的设备上都显示一样大小.(iphone6和iphone4下大小肯定是应该不一样的,否则用户体验很差) ...

  7. 【spring cloud】对接口调用者提供API使用的安全验证微服务【这里仅通过代码展示一种设计思想】【后续可以加入redis限流的功能,某段时间某个IP可以访问API几次】

    场景: 公司的微服务集群,有些API 会对外提供接口,供其他厂商进行调用.这些公开的API接口,由一个OpenAPI微服务统一提供给大家. 那么所有的调用者在调用公开API接口的时候,需要验证是否有权 ...

  8. Android 蓝牙技术 实现终端间数据传输

    蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙技术在Android系统下的使用方法技巧.蓝牙是一种短距离的无线通信技术标准,蓝牙协议分为4层,即核心协议层.电缆替代协议层.电话控制协 ...

  9. 在Delphi中应用AOP实现日志功能

    AOP现在很火,网上有这许多支持AOP的框架,对于Delphi来说同样也有MeAOP.不过觉得这些框架太复杂了. 现在有一个系统,基本上都快结束了,整体上当然是没有采用什么AOP的框架.对于这样的系统 ...

  10. 读取配置文件包含properties和xml文件

    读取properties配置文件 /** * 读取配置文件 * @author ll-t150 */ public class Utils { private static Properties pr ...