随笔 - 340  文章 - 8 评论 - 499 trackbacks - 19
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

公告:发表时间超过两个月的随笔的源码一般都被删除了,请勿留言索取。

昵称:天方
园龄:6年2个月
粉丝:27
关注:1

搜索

 
 

常用链接

最新随笔

随笔分类

随笔档案

文章分类

.net学习

最新评论

阅读排行榜

评论排行榜

推荐排行榜

DockPanel Suite使用非常简单,它主要含有两个类DockContentDockPanel

DockContent是可停靠式选项卡的基类,所有可停靠的选项卡控件都必须基础自它。它是Form的子类,也就是说,可停靠的选项卡是一个个单独的窗体。

DockPanel继承自Panel,是可停靠选项卡的容器。

下面将以一个简单的多文档编辑器为例,介绍如何使用DockPanel Suite库。

  1. 新建一个WinForm的项目,加入WinFormsUI的引用
  2. 创建主窗口,将主窗口的IsMdiContainer属性设置为true。在主窗口中加置一个DockPanel控件,并设置其Dock属性为DockStyle.Fill
  3. 创建文档编辑器选项卡窗口TextForm(本例中的文档编辑器窗口中只有一个简单的textbox),将TextForm的基类有Form修改为DockContent
  4. 在主窗口中添加File菜单,并添加new命令。

        int count = 1;
        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TextForm t = new TextForm();
            t.Text = "
文档" + count++;
            t.Show(dockPanel1);
        }

运行效果如下,是不是比较酷?

可能细心的读者已经看出来以上程序的一些不足的地方:

  1. 选项卡的标题都是"TextForm",而不是我在代码中预期的"文档1"、"文档2"的形式。
  2. 选项卡过于灵活(文档选项卡可以被拖动到任意地方),这往往是我们需要限制的,比如说工具选项卡是不希望能拖到屏幕中央的,而文档选项卡是不希望拖到屏幕的四周而能自动隐藏的。

这些问题是很容易解决的,当选项卡继承自DockContent后,在属性设置中就会多出Docking选项,如下图所示。通过这些属性的设置,可以灵活的定制我们的选项卡。

对于问题1,需要把TabText属性设置为null,这样选项的标题就会随着Text属性而改变了。对于问题2,只要设置其合适的DockAreas即可。

另外值得一提的是,可停靠式选项卡和主窗口是一种父窗口和mdi窗口间的关系,因此mdi窗口的那些特性(如获取活动选项卡、选项卡菜单和主窗口菜单合并等)也可以用在这里,这里就不多介绍了。

最后介绍一下选项卡的位置的保存和恢复。

选项卡的位置的保存和恢复可以通过DockPanel的SaveAsXml函数和LoadFromXml函数实现,这两个函数使用非常简单,参看一下控件中的例子很容易使用。如果选项卡需要自定义序列化数据,只需要覆盖GetPersistString函数即可。

试用了一段时间这个库后,总体感觉是美观、大方、强大、简单易用。这些都是非常难得的。就是在选项卡较多的时候,改变窗口大小不是很流畅。当然,这个和.net的winform控件本身不如c++效率高有关(不过在我用过的.net停靠控件中效率也算一流的)。希望今后能看到更多或开发像这样的.net精品项目。

posted on 2007-12-03 22:22 天方 阅读(3892) 评论(14) 编辑 收藏

FeedBack:
#1楼 2007-12-04 17:50 fyuan[未注册用户]
今天拜读了博主关于文件关联的文章,提了个小问题,能不能抽空解答一下?多谢了!
文章地址:http://www.cnblogs.com/TianFang/archive/2007/08/30/858952.html

 回复 引用   
#2楼 2008-02-01 22:55 yxin1322[未注册用户]
当子窗体的样式为float,即漂浮样式时,该窗体可以移除父dockpanel的范围,这并不像真正的MDI多文档程序那样,子窗体是不能移出父容器的。不知道如何解决?
 回复 引用   
#3楼[楼主2008-02-02 23:48 天方      
当窗体样式为float的时候,那个新窗体是一个普通的非模式的对话框类型的,并不是midi窗体那样的父子关系,所以可以移出主窗体的范围,微软的visual studio就是这么样的,这个只是仿的visual studio,也做成了那个样的,作者可能并没有考虑你这样的需求,好像没有这样的设置。
如果看懂了作者的源码,实现这个功能应该也不难,可能得花番功夫吧。

 回复 引用 查看   
#4楼 2008-02-26 09:03 哲子[未注册用户]
如果想在主窗体上加一个picture控件或其他控件,作为主窗口背景,那么应该怎么实现?我看目前只能令见一个新的子窗体,而不能直接在将其放在主窗体上
 回复 引用   
#5楼[楼主2008-03-06 21:57 天方      
作者好像没有提供背景的属性,估计只有改源码去实现了。
 回复 引用 查看   
#6楼 2008-03-10 19:29 cicicici[未注册用户]
我试着用dockpanel做了一个停靠的程序,实现了最基本的。
可我还想程序一启动后,在出来的主窗口中,子窗口一开始就显示在下方,而不是tab。 我把显示的语句写成childFrm.show(dockpanel,DockState.DockBottom) 可是编译器报错:invalid content
请楼主帮忙,我该怎么实现这个。

 回复 引用   
#7楼 2008-03-15 03:02 rteam[未注册用户]
我在mainform中有一个DockPanel:dockPanel1
如果我想在form2中建立一个子窗口到dockPanel1中请问能够实现吗?
要怎么做呢?我试了很多次都不行
mainform mainform1 = new mainform();
codebox codebox1 = new codebox();
codebox1.Show(mainform1.dockPanel1);

ps:codebox是我要建立的那个子窗体。

多谢啦

 回复 引用   
#8楼 2009-05-11 10:20 gisconquer      
请问下博主
怎么程序设置DockContent窗体的大小和位置,我设置都是不起作用的、
博主能不能提高好的方法啊

 回复 引用 查看   
#9楼[楼主2009-05-11 21:46 天方      
@gisconquer
我这里是先手工调整好,然后保存配置,下次就直接读出手工调的窗口位置。
这样比直接编程设置简单易用,效果也好点。如果有精确点的位置的话,研究一下配置文件,直接改配置文件就好了。

 回复 引用 查看   
#10楼 2009-05-12 08:53 gisconquer      
楼主没明白我的问题哦:
下次就直接读出手工调的窗口位置:
就是你读的位置,怎么反应到窗体上的,你也是肯定根据属性设置的,如果设置的,哪个方法呢

 回复 引用 查看   
#11楼 2009-05-30 19:34 robot[未注册用户]
博主help一下,怎么才能让新建的tab在上一个tab的左边建立啊,好像并排的那些都是向右新建的
 回复 引用   
#12楼 2009-10-05 16:18 pang105[未注册用户]
博主,您好:我想实现当子窗体的漂浮样式时,能够像一般的窗口可以最大化最小化,而我试过几种方法以父窗口为载体可以最大化和最小化,当漂浮出来就不行了,不知道有没有办法实现
 回复 引用   
#13楼 2011-04-16 02:22 风黑月高kable      
我用dockpanel suite 来做多文档的,在主窗口里打开子窗口,是可以打开的,方法如下
UsersList childForm = new UsersList();
childForm.Show(dockPanel1);

但是我的UsersList 子窗口里还有个打按钮为添加,又会打开一个窗口,怎么打开啊?怎么能打开在多档的窗口里呢。
请各位帮帮忙!

 回复 引用 查看   
#14楼 2011-04-16 02:23 风黑月高kable      
我用dockpanel suite 来做多文档的,在主窗口里打开子窗口,是可以打开的,方法如下
UsersList childForm = new UsersList();
childForm.Show(dockPanel1);

但是我的UsersList 子窗口里还有个打按钮为添加,又会打开一个窗口,怎么打开啊?怎么能打开在多档的窗口里呢。
请各位帮帮忙!

 回复 引用 查看