我有这个带有面板的表格。该表格包含三个面板。
一个面板是可折叠的,充当侧边栏,另一个面板位于顶部,用于显示标题,最后一个面板是通过单击面板一中提供的项目之一打开的表单的占位符。
现在我想做的是根据面板一的状态调整(增大和缩小)占位符面板和在面板上打开的表单的大小(仅宽度),面板一可以展开或折叠。扩展坞无法工作。
最佳答案
经过一些澄清后,所描述的表单的所需布局和行为似乎与此示例配置类似:
一个WinForms
Form
嵌入另一个 Form
,并放置在 Panel
内.
这位客人Form
被剥夺了其 TopLevel
徽章和中央面板的父级,如下图示例所示:
如何对接这些 Panels
获取此布局:
绿色面板位于表单顶部。
深灰色面板位于表单的左侧。
灰色面板占据剩余空间。
- 在表单容器上插入三个面板。
- 绿色小组需要保持其地位,永远不会改变:
- 右键单击 → SendToBack (
!important
:)。 - 停靠→顶部。
- 右键单击 → SendToBack (
- 深灰色面板位于绿色面板下方、表单左侧。它需要在需要时调整自身大小,但永远不会覆盖绿色面板:
- 停靠→左
- 灰色面板需要占用剩余空间。它需要在需要时调整自身大小,但永远不会覆盖绿色面板或深灰色面板:
- 右键单击 → BringToFront (
!important
) - 码头 → 中心
- 右键单击 → BringToFront (
对接时的最高优先级被分配给堆栈中 z 顺序最低的元素:此处为绿色面板。
最低优先级分配给具有最高 z 顺序的元素:灰色面板,然后它将在具有较高优先级(遵循 z 顺序)的所有其他元素中收缩和拉伸(stretch)。
如何嵌入表单:
简单的部分。它是我们项目中的一个表单,无需执行任何魔法即可在重新设置父级时使其保持事件状态:
(这仅适用于 1 个表单。对于更多表单,您将需要类似 List<Control>
的内容:
//Define here the Form which will be embedded
[Your Form Class] EmbeddedForm;
private void button1_Click(object sender, EventArgs e)
{
EmbeddedForm = new [Your Form Class]() {
TopLevel = false,
Parent = panContainer,
Location = new Point(4, 4),
Enabled = true
};
EmbeddedForm.Show();
}
private void buttonShrink_Click(object sender, EventArgs e)
{
//Maybe insert a classic dotted mini-button to re-inflate the sidebar when needed
panelSideBar.Width = 6;
}
private void panelContainer_Resize(object sender, EventArgs e)
{
Rectangle rect = panelContainer.ClientRectangle;
rect.Inflate(-3, -3);
EmbeddedForm.Size = rect.Size;
}
如果您允许容器面板 AutoScroll
其内容为 Resize
事件不是必需的。
编辑:
示例图形中 Form 的完整源代码的 PasteBin:
Embedded Forms
关于c# - 自动调整面板上呈现的多个表单的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471230/