停靠面板可以被停靠到窗体 (用户控件) 、其他停靠面板中,或者使它们浮动。 本主题描述了如何在代码中执行这些停靠操作。停靠功能 章节演示了最终用户如何执行同样的停靠操作。
要查看如何在代码中创建和销毁停靠面板,以及把可视化控件添加到面板中,请参阅 创建和销毁停靠面板 文档。
保存和恢复停靠面板的布局 主题说明了如何保存和恢复停靠面板的布局。 如果要通过代码创建停靠面板,或者修改停靠面板的布局,然后恢复已保存的布局,则这些信息是有用的。本主题包含下列小节:
停靠到窗体
如果需要添加一个控件 (它的停靠样式被设置为 Fill),是为了在窗体中间显示其他可视化控件,则不要使用停靠面板来实现此目的。 而是使用 Panel、System.Windows.Forms.TabControl 或 XtraTabControl 控件。
停靠面板只能位于窗体内部,该窗体被停靠管理器的 DockManager.Form 属性引用。 该属性必须始终引用一个有效的窗体 (用户控件),否则不能创建和停靠面板。
可以使用下列方法来把面板停靠到窗体中:DockManager.AddPanel |
创建一个新面板并把它停靠到窗体中。
用法: newPanel = dockManager1.AddPanel(dockStyle); |
DockPanel.DockTo 方法的重载,该重载有一个 dock (DockingStyle 类型) 参数。 |
允许把已有的面板停靠到窗体中。
用法: panel.DockTo(dockStyle); panel.DockTo(dockStyle, index); |
把 dockStyle 参数设置为 DockingStyle.Float 将使面板浮动。 如果 dockStyle 设置为 DockingStyle.Fill,则面板不会被创建,并且已有的面板不会被移动到新位置。
关于 index 参数的信息,请参阅下面。
示例 1
在下列代码中创建了两个面板,并且分别把它们停靠到窗体的下边缘和右边缘:
C# | 复制代码 |
---|---|
// Create a panel and dock it to the bottom. DockPanel panel1 = dockManager1.AddPanel(DockingStyle.Bottom); panel1.Text = "Panel 1"; // Create a panel and dock it to the right. DockPanel panel2 = dockManager1.AddPanel(DockingStyle.Right); panel2.Text = "Panel 2"; |
Visual Basic | 复制代码 |
---|---|
// Create a panel and dock it to the bottom. Dim panel1 As DockPanel = dockManager1.AddPanel(DockingStyle.Bottom) panel1.Text = "Panel 1" // Create a panel and dock it to the right. Dim panel2 As DockPanel = dockManager1.AddPanel(DockingStyle.Right) panel2.Text = "Panel 2" |
所有可视的浮动面板和被停靠到窗体中的面板都被称为根面板,并且可以通过 DockManager.RootPanels 集合访问它们。 注意,此集合不包含被停靠到其他面板 ( 标签式容器 或 分隔式容器) 中的可视面板。
在此集合中的每个面板都通过从零开始的、由 DockPanel.Index 属性指定的唯一索引进行识别。 它定义了在 DockManager.RootPanels 集合中的面板的位置。
对于被停靠到窗体中的面板,它们的索引也定义了面板在窗体内的布局。 假设此集合中不包含浮动面板,则停靠到窗体中的面板的索引如下。 完全占用窗体某个边缘的面板有最小的索引 (0)。 其他面板仅可以被停靠在未被第一个面板占用的区域。 完全占用此区域任意边缘的面板的索引为 1,等等。DockManager.AddPanel 方法只是把新面板添加到 DockManager.RootPanels 集合的末端。
假设在上述示例中,在面板被创建并停靠到窗体之前,DockManager.RootPanels 集合为空集合。 在这种情况下, panel1 将被添加到集合中的第一个位置,它的索引将等于 0,并且它将完全占用被停靠到的边缘 (下边缘)。 panel2 的索引将是 1,并且将占用未被第一个面板占用的区域内的相应 (右) 边缘。
下面的插图展示了一个更复杂的窗体内面板布局的示例。Panel 3 的索引是 2,因此它被停靠到未被 Panel 1 和 Panel 2 占用的区域内相应的 (右) 边缘。
DockPanel.DockTo 的有 index 参数的重载只是把指定的面板放置到 DockManager.RootPanels 集合内由 index 参数指定的位置。 此面板的 DockPanel.Index 将被设置为指定的 index。 集合中该位置之后的面板的索引将被加上 1。 结果,这些面板将被重新排列来反映这些更改。
示例 2
下面的示例展示了如何把已有的面板停靠到窗体的特定位置。
假设已有两个停靠面板被停靠到窗体中,如下所示:为了停靠 panel3 来让它完全占用窗体的左边缘,则可以使用 DockPanel.DockTo 的重载。 它的 dock 参数应该被设置为 DockingStyle.Left ,并且 index 参数被设置为 0。
C# | 复制代码 |
---|---|
DockPanel panel3;
// ...
panel3.DockTo(DockingStyle.Left, 0);
|
Visual Basic | 复制代码 |
---|---|
Dim panel3 As DockPanel ' ... panel3.DockTo(DockingStyle.Left, 0) |
要把某个面板移动到窗体内其他面板之间的指定位置,而不改变停靠样式,则可以直接修改 DockPanel.Index 属性。 这样将在 DockManager.RootPanels 集合内移动面板,并且导致重新排列面板。
示例 3
下面的示例展示了如何改变窗体内某个面板的位置,而不改变该面板的停靠样式。
考虑面板的下列布局:把 Panel 3 的索引设置为 1,将从它先前的位置取消停靠此面板,并把它停靠到未被较小索引的面板占用的区域 (未被 Panel 1占用的区域,其索引为 0)。 在代码中,“Panel 3” 的停靠样式 (DockingStyle.Bottom) 没有被改变。
C# | 复制代码 |
---|---|
DockPanel panel3;
// ...
panel3.Index = 1;
|
Visual Basic | 复制代码 |
---|---|
Dim panel3 As DockPanel ' ... panel3.Index = 1 |
停靠到其他面板
分隔式容器是一个停靠面板,它的子面板被并排显示 (垂直或水平显示)。 标签式容器也是一个停靠面板,它的子面板被显示在标签页面内。 标签式容器和分隔式容器都通过 DockPanel 对象表示。 与常规停靠面板不同,在把面板停靠到其他面板或者取消停靠时,会导致标签式容器和分隔式容器被自动创建和销毁。 这些容器仅可以显示子面板,而不能显示任何可视化控件 (控件、标签等)。
要在代码中把一个面板停靠到其他面板,可以使用下列方法:
DockPanel.DockTo 的有 panel (DockPanel 类型) 参数的重载。 |
这些方法可以用于形成新的分隔式容器,以及把面板添加到任意已有的分隔式容器和标签式容器中。
用法: currentPanel.DockTo(targetPanel); currentPanel.DockTo(targetPanel, index); targetPanel 参数指定目标面板。 如果它引用了一个常规面板 (既不是分隔式容器,也不是标签式容器),则将新建一个分隔式容器,并且该容器将包含 targetPanel 和 currentPanel。 如果 targetPanel 引用了一个分隔式容器或标签式容器,则 currentPanel 被添加到该容器中作为其子面板。 DockTo 的有 targetPanel 和 index 参数的重载可以用于把当前面板,添加到目标容器内的特定位置。 请参阅下面的内容获得关于面板索引的信息。 |
DockPanel.DockAsTab 重载。 |
这些方法允许把面板组织到标签式容器中。
用法: currentPanel.DockAsTab(targetPanel); currentPanel.DockAsTab(targetPanel, index); 如果 targetPanel 不是标签式容器,那么将新建一个标签式容器,并且该容器将包含 targetPanel 和 currentPanel。 如果 targetPanel 是 标签式容器,则 currentPanel 将被追加到此容器中。 DockAsTab 的有 index 参数的重载可以用于把当前面板放置到目标标签式容器中的指定位置。 请参阅下面的内容来获得关于面板索引的信息。 |
DockPanel.AddPanel |
新建一个面板并把它停靠到当前面板中。
用法: newPanel = panel.AddPanel(); 如果 panel 表示一个常规面板 (既不是分隔式容器,也不是标签式容器),则将新建一个分隔式容器,并且此容器将包含 panel 和 newPanel。 如果 panel 表示一个容器,则 newPanel 将被添加到该容器中作为其子面板。 |
index 参数 (DockPanel.DockTo 和 DockPanel.DockAsTab 重载的参数) 指定一个从零开始的整数,该整数指向当前面板被移到目标容器中的位置。 如果把 index 设置为 0,则该面板将被添加作为目标容器中子面板之间的第一个项。 把 index 设置为 1,则把该面板添加作为第二个项,等等。 把 index 参数设置为 -1,则把该面板追加到容器中。
要获得面板在容器内的位置,可以使用 DockPanel.Index 属性。 它与 index 参数值匹配。
在容器中的面板数目由 DockPanel.Count 属性返回。
要获取拥有特定面板的容器,可以使用该面板的 DockPanel.ParentPanel 属性。 可以通过 DockPanel.Item 索引器访问容器中的子面板。 如果某个面板属于特定的容器,该容器又属于其他容器等,则 DockPanel.RootPanel 属性可以用于获取面板的根容器。
示例 4
下列代码展示了如何创建一个分隔式容器,它由三个面板组成。
假设三个面板 (panel1、panel2 和 panel3) 已经被停靠在窗体上:下列代码把 panel2 依靠到 panel1,并且形成一个分隔式容器。
C# | 复制代码 |
---|---|
DockPanel panel1, panel2, panel3;
// ...
panel2.DockTo(panel1);
|
Visual Basic | 复制代码 |
---|---|
Dim panel1, panel2, panel3 As DockPanel ' ... panel2.DockTo(panel1) |
接下来,把 panel3 停靠到所创建的容器中的第一个位置。 要执行此任务,则使用 DockPanel.DockTo 的有 index 参数的重载:
C# | 复制代码 |
---|---|
// Get the container that owns panel1 and panel2. // The panel2.ParentPanel statement would give the same result. DockPanel container = panel1.ParentPanel; if(container == null) return; // Dock panel3 to the container. panel3.DockTo(container, 0); |
Visual Basic | 复制代码 |
---|---|
' Get the container that owns panel1 and panel2. ' The panel2.ParentPanel statement would give the same result. Dim container As DockPanel = panel1.ParentPanel If container Is Nothing Then Return ' Dock panel3 to the container. panel3.DockTo(container, 0) |
示例 5
C# | 复制代码 |
---|---|
DockPanel panel1, panel2;
// ...
panel2.DockAsTab(panel1);
|
Visual Basic | 复制代码 |
---|---|
Dim panel1, panel2 As DockPanel ' ... panel2.DockAsTab(panel1) |
示例 6
在下列代码中,创建了一个分隔式容器,然后把它转换为标签式容器。
假设 panel1 和 panel2 面板已经被停靠在窗体中,如下所示:在下列代码中,这些面板被组合到一个分隔式容器中。
C# | 复制代码 |
---|---|
DockPanel panel1, panel2;
// ...
panel2.DockTo(panel1);
|
Visual Basic | 复制代码 |
---|---|
Dim panel1, panel2 As DockPanel ' ... panel2.DockTo(panel1) |
要把分隔式容器转换为标签式容器,则该容器的 DockPanel.Tabbed 属性应该被设置为 true:
C# | 复制代码 |
---|---|
// Get the split container that owns panel1 and panel2. // The panel2.ParentPanel statement would give the same result. DockPanel container = panel1.ParentPanel; if(container == null) return; // Transform the split container to a tab container. container.Tabbed = true; |
Visual Basic | 复制代码 |
---|---|
' Get the split container that owns panel1 and panel2. ' The panel2.ParentPanel statement would give the same result. Dim container As DockPanel = panel1.ParentPanel If container Is Nothing Then Return ' Transform the split container to a tab container. container.Tabbed = True |
使面板浮动
要使某个面板浮动,可以使用下列方法:
DockPanel.MakeFloat |
使已有的面板浮动。
用法: panel.MakeFloat(); panel.MakeFloat(pointScreen) MakeFloat 的有 pointScreen 参数的重载可以用于使面板浮动,并把它移动到指定的位置 (该位置以屏幕坐标指定)。 |
DockManager.AddPanel 的 dockStyle 参数被设置为 DockingStyle.Float 的重载。
DockManager.AddPanel 的有 floatLocation (Point 类型) 参数的重载。 |
新建一个面板并使它浮动。
用法: dockManager1.AddPanel(DockingStyle.Float); dockManager1.AddPanel(point); |
示例 7
C# | 复制代码 |
---|---|
panel1 = dockManager1.AddPanel(new Point(300, 300));
|
Visual Basic | 复制代码 |
---|---|
' Create a floating panel. panel1 = dockManager1.AddPanel(New Point(300, 300)) |
要修改面板在浮动时的大小,也可以使用 DockPanel.FloatSize 属性。