停靠面板是停靠应用程序的主要构成部件。 它们呈现了可以放置可视化控件的可停靠窗口。 面板可以被停靠到其他面板中,或者浮动。 允许最终用户拖动面板标题,来把某个面板放置到新位置上,这样就执行了停靠操作。
可以通过 停靠管理器 组件来创建停靠面板。
创建停靠面板
常规面板和容器面板
在 Docking 库中,“Dock Panel”是常规面板和容器面板的公共名称。
常规面板 提供了客户区,在客户区中可以放置多种可视化控件 (按钮、编辑器、树状视图等)。 下面的插图展示了一个常规面板,在它的客户区中显示了一个树状视图:
当某个常规面板被停靠到另一个常规面板时, 将自动创建一个 容器面板,该容器面板包含了这两个常规面板。 容器面板可以显示任意数目的子面板。 注意,容器面板也可以包含其他容器面板。 因此可以创建嵌套的停靠面板布局。
有两种类型的容器面板: 分隔式容器 (split containers) 和标签式容器 (tab containers)。 分隔式容器 并排显示它的子面板 (垂直或水平显示)。 标签式容器 把它的子面板显示在标签页中。 下面的插图展示了一个分隔式容器和一个标签式容器,它们都拥有两个面板 (Panel 1 和 Panel 2):当容器面板中只有两个面板、并且其中一个面板已经从容器中取消停靠时,容器面板被自动销毁。
每个停靠面板 (常规面板、分隔式容器面板或标签式容器面板) 都通过 DockPanel 对象呈现。
要获取拥有某个特定停靠面板的容器面板,可以使用 DockPanel.ParentPanel 属性。 如果该属性返回 null,则此面板没有在任何容器面板中。 可以使用容器面板对象的索引器符号来访问它的子面板。 子面板的数目可以通过容器面板的 DockPanel.Count 值确定。当面板属于某个容器时,该面板的 DockPanel.ParentPanel 属性返回直接的父容器。 因为容器可以属于其他容器,因此可能需要获取面板的根容器。 要获取根容器,则使用 DockPanel.RootPanel 属性。
要确定某个特定的面板是否为常规面板还是容器面板,可以读取它的 DockPanel.Count 属性。 对于常规面板,该属性总是返回 0,对容器面板则此属性的返回值大于或等于 2。 要确定某个特定容器的类型,可以使用它的 DockPanel.Tabbed 属性 (标签式容器返回 true,分隔式容器返回 false)。 该属性也允许把分隔式容器转换为标签式容器,反之亦然。
停靠面板的结构
在代码中可以使用 DockPanel.ControlContainer 属性来管理面板中的可视化控件。 要在代码中添加或操作面板中的可视化控件,可以使用 DockPanel.ControlContainer 对象的 Controls 集合。 不要使用该面板的 Controls 集合来实现此目的。 此集合始终只包含一个指向 ControlContainer 对象的项。
在设计时刻把可视化控件放置到某个面板上时,该控件是被放置到 DockPanel.ControlContainer 中,而不是面板本身。
停靠功能
使用拖放操作,停靠面板可以被停靠到窗体上,或者停靠到其他停靠面板中。 当某个面板被停靠到其他面板中时,将自动创建一个容器面板。 所创建的容器面板的类型 (分隔式容器或标签式容器) 由被拖动面板所停放的位置确定。 请参阅 停靠功能 章节来获得其他信息。
当某个面板被停靠到窗体上时,通过单击自动隐藏按钮,它的 自动隐藏功能 可以被激活 ()。 在这种情况下,当鼠标指针离开面板的边界时,此面板自动被最小化。 仅有该面板的标签被显示在窗体的相应边缘,把鼠标指针停留在该面板标签上时,可以显示整个面板。
通过单击面板的关闭按钮 ()来隐藏面板 (完全从屏幕上移除)。 然后可以通过代码让它可视。
如果停靠面板没有被停靠到窗体上,则它被浮动。 例如,最终用户可以通过把面板拖出它所停靠的控件,来使它浮动。 在拖动时按下 CTRL 键可以确保被拖动的面板不会被停靠到任何其他面板中,直到释放 CTRL 键。 可以自由地在屏幕上移动浮动面板。请参阅 浮动面板 章节来获得更多关于浮动面板的细节。
下面的屏幕截图演示了浮动面板和被停靠到窗体上的面板:
访问停靠面板
只需要获得已隐藏的面板,则可以使用 DockManager.HiddenPanels 属性。
DockManager.AutoHideContainers 集合中包含了自动隐藏的容器 (沿窗体边缘的 bars,显示了自动隐藏面板的标签)。 每个容器都提供了对它所包含的自动隐藏面板的访问。
可视的浮动面板和停靠到窗体的面板都包含在 DockManager.RootPanels 集合中。 注意,此集合仅包含根面板 (没有在其他面板中的面板)。 例如,如果有两个常规面板被组合到一个已停靠在窗体上的标签式容器中, 则 DockManager.RootPanels 集合仅包括一个项 (该标签式容器)。 常规面板是该标签式容器的子对象,因此可以通过应用于此容器的索引器符号进行访问。
可视性
如果此属性值设置为 DockVisibility.Hidden,则从屏幕上移除该面板。 这类似于通过单击面板的关闭按钮 () 来隐藏它。
把 DockPanel.Visibility 属性设置为 DockVisibility.AutoHide 来激活面板的自动隐藏功能。 注意,自动隐藏功能不可以应用于浮动面板。
如果某个面板没有被隐藏,也没有被自动隐藏,则它在屏幕上可视,并且它的 DockPanel.Visibility 属性值设置为 DockVisibility.Visible。 属于自动隐藏的标签式容器的个别面板的 DockPanel.Visibility 属性不能被设置为 DockVisibility.Visible。 在这种情况下,只可以修改标签式容器的该属性。
停靠面板的设置
停靠面板的自定义设置和行为设置由 DockManager 和 DockPanel 对象提供。
停靠管理器指定它所拥有的全部停靠面板的公共设置。 它有一个 DockManager.DockingOptions 属性,此属性提供了一组选项:停靠管理器的选项 | 说明 |
---|---|
DockingOptions.CloseActiveTabOnly | 应用于标签式容器中的停靠面板。 指明在单击关闭按钮时,标签式容器本身或其活动面板是否被隐藏。 |
BaseDockOptions.FloatOnDblClick | 指明最终用户是否可以通过双击已停靠面板的标题来使它浮动。 继续双击浮动面板的标题将把它恢复到先前的位置。 |
DockingOptions.HideImmediatelyOnAutoHide | 指明在自动隐藏功能已激活的面板被隐藏时,是否使用滑动动画效果。 |
BaseDockOptions.ShowAutoHideButton | 允许使用面板的自动隐藏按钮 ()。 |
DockingOptions.ShowCaptionOnMouseHover | 指明是否仅当鼠标指针停留在面板顶部时才显示停靠面板的标题,还是始终显示停靠面板的标题。 |
BaseDockOptions.ShowCloseButton | 允许使用面板的关闭按钮 ()。 |
BaseDockOptions.ShowMaximizeButton | 允许使用面板的最大化按钮 ()。 |
如果通过停靠管理器的选项使自动隐藏按钮、关闭按钮和最大化按钮可用,则仍然可以通过 DockPanel.Options 属性来隐藏个别面板的上述按钮。
下表列出了 DockPanel 对象提供的主要属性:DockPanel 对象的属性 | |
---|---|
DockPanel.Text | 指定面板的标题。 |
DockPanel.TabText | 指定面板的短标题; 当面板被添加到标签式容器中时,短标题被显示在与面板对应的标签内部; 当面板被自动隐藏时,短标题被显示在自动隐藏按钮内。
如果该属性被设置为一个空字符串,则使用 Text 属性值作为短标题。 |
DockPanel.TabsPosition | 指定在标签式容器内的标签位置 (顶部、左侧、右侧或底部)。 |
DockPanel.TabsScroll | 指定在标签不适合于标签式容器的宽度/高度时,是否显示标签导航按钮。 |
DockPanel.ImageIndex | 指定与停靠面板相关的图像的索引号。 当面板被添加到标签式容器中时,该图像被显示在标签内; 当面板被自动隐藏时,该图像被显示在自动隐藏按钮内。 |
停靠面板的外观设置 (字体属性、前景色和背景色、背景图像等) 由 BarAndDockingController 的 BarAndDockingController.AppearancesDocking 属性控制。 它提供了一组样式属性,用于定制面板的客户区、活动标签和非活动标签、活动面板的标题和非活动面板的标题等。
DockPanel.Appearance 属性可以用于指定个别面板的外观设置。 这些设置将覆盖由 BarAndDockingController 公开的默认设置。
下面的插图展示了影响面板外观的主要设置: