关于DockPageCaption的说明

其实weifenluo先生写的dockpanel中用到了很重要的一个控件是DockPane,如下图

这个控件其实由2个重要的控件组成的

分别为DockPaneCaptionBase

DockPaneStripBase。

这个DockPaneCaptionBase控件,是比较简单的。显示当前显示activeContent的标题和几个操作按钮(改变停靠状态的按钮和窗口关闭的按钮)

所以我想先从这个控件讲一下它的实现。

基本的代码还是用weifenluo先生的代码,只是将一些耦合度高的代码去除了,增加了一些属性和事件,让它和外间交互。

如果你们去看weifenluo先生的源代码的话,就会发现在dockpane的InternalConstruct函数中有一下的处理

m_captionControl = DockPanel.DockPaneCaptionFactory.CreateDockPaneCaption(this);

所以DockPaneCaptionBase控件是依赖与DockPane控件。也就是说如果没有DockPane控件的话,DockPaneCaptionBase控件也不会存在。

这个依赖度是很强的。这里我将他们的关系解耦了。为什么一定要有这个耦合度呢。

我将DockPaneCaptionBase控件设计成一个能够独立存在的控件。可以给任何控件用,不一定只有DockPane控件能用。

按照这个思路,以及不改变原有的功能的前提下,我重新定义了一个相对于DockPaneCaptionBase控件的DockPageCaptionBase,

在它上面定义一些属性和事件,他们是

事件

ActiveContentChanged      ActiveContent放生改变的时候发生

DockContentClicked        鼠标左键按下的时候发生                              

DockContentDoubleClicked    鼠标双击的时候发生

属性

ActiveContent { get;set }   

IsActivated { get;set }  

CaptionText { get }      当ActiveContent发生改变的时候,自动改变

DockButton { get; }      改变停靠状态的按钮
CloseButton { get; }      窗口关闭的按钮

 

这样定义之后,DockPageCaptionBase控件只和dockContent发生了联系。这样耦合度就降低了

最后看一下,在dockpane中如何使用该控件,代码如下,在dockpage的构造函数生成这个控件

m_captionControl = new VS2005DockPageCaption();

这样该控件是独立存在的控件了,不需要dockpage对象的传入

 

在RefreshChanges函数中 通过外部控件dockpage来对他的状态进行更新。

DockPageCaptionControl.ActiveContent = this.ActiveContent;
DockPageCaptionControl.IsActivated = this.IsActivated;

这样对于外部控件dockpage来说,根本不需要知道DockPageCaption控件当他的属性ActiveContent ,IsActivated发生改变的时候,会有什么样的反映

 

这个控件就这么多。如果要详细的知道这个控件的话,可以看源代码,这个控件的源代码相对比较的简单。

但是这个是我改写整个dockpanel的核心思路。看懂了这个我想其他的控件应该也没有太大的问题了

由于本人文笔很差。也只能写出这样的文章,多多包涵了。

 

 

 

 

 

 

 

posted on 2012-02-03 17:41  郭永荣  阅读(383)  评论(1编辑  收藏  举报