在WinForm项目中要求实现动态加载DockPanel。

简单研究了下,演示代码如下:

很简单几行代码,实现了基本意图。看起来问题很快解决。

但是实际应用中发现几个问题:

1、当第一次运行时,dockManager1.AddPanel后dockManager1.Panels.Count值为1;当DockAsTab后,dockManager1.Panels.Count值为3,系统居然自动增加了一个DockPanel。

2、使用DockAsTab方式,新的DockPanel总是在已有DockPanel右边生成,然后再融合进去,用户体验非常差,尤其是主程序中间有Mdi子程序时,总会有屏幕不停闪烁的效果。

这是怎么回事呢?

通过研究DockPanel的相关文档,终于明白DockPanel的运行机制。

在论述下面的一些观点前,先说明笔者使用的是DX11版本带的DockManager和DockPanel控件。

一个典型的DockPanel如下图。它包括DockPanel主体和容器两个部分。DockPanel中要承载其他控件时,控件容器必须建立。

在DX中,实例化一个DockPanel有三个方法。第一种方法示例如下:

DockPanel runPanel = new DockPanel();

该方法有两点需要注意:

Ø        它不会自动建立控件容器,需要使用者手工添加,代码示例如下:

ControlContainer _dockPanelContainer =newDevExpress.XtraBars.Docking.ControlContainer()

_dockPanelContainer.Name= "dockPanel_Container";

runPanel.Controls.Add(_dockPanelContainer);

//添加控件

runPanel.ControlContainer.Add(newControl());

Ø        它需要手工注册到DockManager中去

runPanel.Register(dockManager1);

第二种方法是常用的方法,示例如下:

DockPanel runPanel = dockManager1.AddPanel(DockStyle.Left);

它会自动注册DockPanel到DockManager,同时添加一个ControlContainer。

第三种方法示例如下:

DockPanel runPanel = sameDockPanel.AddPanel();

它由一个已存在的DockPanel创建一个新的DockPanel。

该新DockPanel的ParentPanel不是创建者,而是由系统自己建立的一个PanelContainer,该PanelContainer同时被设置为RootPanel。

停靠模式

DockPanel有两种停靠模式,Split和Tab模式。

Split模式界面示例如下图,两个DockPanel根据实际停靠风格并立在一起。

默认情况下,当我们建立好两个DockPanel,将它们直接show出来,它们呈现的就是如下图的Split模式。

Tab模式如下图,两个DockPanel是以分页样式融合在一起。示例代码如下:

最后演示效果图如下:

在这里需要明确的是:

当某个位置(如左边)只有一个DockPanel时,该DockPanel的ParentPanel和RootPanel都是自己。当存在两个及以上DockPanel时,所有DockPanel的ParentPanel和RootPanel都是由系统生成的一个公共DockPanelContainer作为父容器,该容器容纳所有同位置的DockPanel。

在关闭同位置的DockPanel时,若只剩下一个DockPanel,则DockPanelContainer会被系统自动释放。

明白了上面的这些原理,对解决上面提出的两个问题就找到了答案。

第一个问题如上所述,当同一位置存在两个或两个以上的DockPanel时,系统自动生成一个容器来容纳。

第二个问题,当在使用DockAsTab前,两个DockPanel是Split模式,之后才变为Tab模式。解决方法就是使用已存在的DockPanel建立新的DockPanel,然后把二者的ParentPanel设置为Tab模式。

另外在这里提一下,DockPanel中默认只能放置UserControl,如果使用Form类型,需要把TopLevel设置下,但是放置在DockPanel中的Form太有个性了。

一个典型的Tab模式DockPanel如上图。

最后,贴出部分实际代码供大家参考:

 在使用DevExpress过程中,原先已经创建好的导航窗体,如何添加到DockPanel中进行展示?

             FormX frmX = new FormX();

             frmX.Show(this.DockPanel1);            

     frmX.Dock = DockStyle.Fill;            

         frmX.TopLevel = false;            

     frmX.FormBorderStyle = FormBorderStyle.None;            

     this.DockPanel1.Text = frmX.Text;            

     this.DockPanel1.TabText = frmX.Text;            

     this.DockPanel1.Controls.Add(frmX);            

 这样处理即可,如果DockPanel是动态创建的。需要这样来写:

 DockPanel panelX = new DockPanel();            

 panelX = this.DockManager1.AddPanel(DockingStyle.Left);

 然后将上面的DockPanel1替换成panelX即可。

试了以上几种方法还是没有达到效果,看来是我还没研究透

C#中如何动态加载DockPanel的更多相关文章

  1. 解决tableView中cell动态加载控件的重用问题

    解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...

  2. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  3. 关于Unity3D中Resources动态加载NGUI图片的方法

    在NGUI中有些图片我需要动态进行变更或者加载,怎么办? 首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~ NGUI加载图片的方法 ...

  4. bootstrap中的动态加载出来的图片轮播中的li标签中的class="active"的动态添加移除

    //该方法是在slide改变时立即触发该事件, $('#myCarousel').on('slide.bs.carousel', function () { $("#myCarousel o ...

  5. java中的动态加载和热替换

    https://blog.csdn.net/u010833547/article/details/54312052 ****************************************** ...

  6. Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单

    在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...

  7. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  8. Unity中资源动态加载的几种方式比较

    http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安 ...

  9. js 页面图片等元素在普通元素中滚动动态加载技术

    /*! * 2012-01-13 v1.1 偏移值计算修改 position → offset * 2012-09-25 v1.2 增加滚动容器参数, 回调参数 * 2015-11-17 v1.3 只 ...

随机推荐

  1. Understanding Optional and Compulsory Parameters

    If the MVC Framework cannot find a value for a reference type parameter (such as a string or object) ...

  2. C++ 取整数学函数

    C++ 取整数学函数 将浮点数取整或者四舍五入的数据处理情况经常见到,下面做一下总结. 注意:函数取整返回值均为 double 型,在用 printf 输出时应注意. 数学头文件 #include&l ...

  3. Qt应用如何发布

    原文请看:http://www.cnblogs.com/ungshow/archive/2010/10/10/1847082.html 通常情况下,使用Qt开发应用都是采用动态编译的方式来进行发布,发 ...

  4. LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)

    #6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6   题目描述 给出 ...

  5. ubuntu问题集锦

    我使用的是ubuntu 14.04 用UltraIOS 制作镜像安装的  ubuntu 问题1:闪屏问题以及文字显示不全 解决方案:重装显卡驱动 解决过程:http://my.oschina.net/ ...

  6. Codeforces #447 Div.2 Tutorial

    Problem A:QAQ 给一个字符串,求出可非连续的QAQ序列有多少个. Analysis:比较水的一道题,记录每一个Q的位置,预处理A的个数即可 然而还是fst了,原因是未考虑一个Q都没有的极端 ...

  7. SD 一轮集训 day4 弦形袋鼠

    可以发现把每一个 a[i] * b[i] 加到矩阵里去,就相当于 把一个 1*m 的向量伸缩后变成 n个再加到矩阵里去,所以答案就是远=原矩阵中线性线性无关组的个数. (而且好像一个矩阵横着消元和竖着 ...

  8. 【树形dp】Rebuilding Roads

    [POJ1947]Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11934   Accep ...

  9. 【高斯消元】CDOJ1785 曜酱的线性代数课堂(三)

    高斯消元求行列式板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...

  10. 【穷竭】POJ3187-Backward Digit Sums

    [思路] 利用杨辉三角形,每一个数字被加的次数等于它在杨辉三角形中对应的那个数字.注意这道题的意思是,最底层是N的全排序,而不是指1..10都可以.生成杨辉三角形的时候第一次我用了二重循环模拟生成,后 ...