调整面板大小以适应 Windows 窗体中包含的元素

Posted

技术标签:

【中文标题】调整面板大小以适应 Windows 窗体中包含的元素【英文标题】:Resize panel to fit contained elements in windows forms 【发布时间】:2011-11-26 09:03:13 【问题描述】:

我正在创建一个可折叠的面板元素,它本质上是一个带有按钮元素和按钮下方的面板元素的面板元素。单击该按钮会使相邻面板具有Visible = false。当子面板设置为不可见时,我想调整包含面板的大小。

我通过将Size 属性设置为可见元素(按钮或按钮和子面板)的宽度和高度的总和来手动完成此操作。

我很想知道是否有办法在不手动调用Size 的情况下强制调整包含面板的大小。

我想我正在寻找属性 Dock=Fill 的倒数,它会根据包含元素的大小自动调整元素的大小。

提前致谢。

【问题讨论】:

我想就是这样。也许您可以使用 FlowLayoutPanel 自动调整其客户区域内的面板,但我认为您所做的是正确的。 没人能看到的时候调整大小有什么意义? @Hans Passant:对不起,这个问题的措辞可能很有趣。有两个面板。一个是不可见的,另一个包含按钮和不可见的面板。当内面板不可见时,外面板需要收缩,否则它不会塌陷,它只是消失了,但仍占用与以前相同的空间。当您展开和折叠说“通用控件”部分时,我试图按照您在 Visual Studio Forms Toolbox 中看到的内容做一些事情。 【参考方案1】:

我刚刚尝试了ispiro给出的答案。您不需要删除和添加控件。设置Visible 可以工作。这取决于您何时执行布局。如果 panel2 在 panel1 之前执行布局,则 panel2 不会调整大小。为方便起见,请改用父母 PerformLayout

它是这样使用的:

panel1.ResumeLayout(false);
panel2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();

【讨论】:

【参考方案2】:

怎么样:

panel1.Size = new Size(0, 0);
panel1.AutoSize = true;

然后不要改变可见性,而是这样做:

panel1.Controls.Remove(panel2);

当你想把它带回来时:

panel1.Controls.Add(panel2);

(panel1 为后面板)

【讨论】:

伟大的想法。所以 AutoSize 是我正在寻找的属性。唯一的问题是这应该跟一个 panel2.BringToFront() 否则它会抛出停靠顺序。

以上是关于调整面板大小以适应 Windows 窗体中包含的元素的主要内容,如果未能解决你的问题,请参考以下文章

从底部调整大小时防止Windows窗体元素离开视图?

如何将 QMainWindow 调整大小事件传递给 QMainWindow 中包含的 QGLWidget?

在容器 Kendo 窗口调整大小时动态更改 Kendo Grid 行的高度

如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?

如何在 Windows 窗体中调整列表控件的添加/删除大小以提供类似锚定的行为

WinForm开发中实现控件随窗体大小的改变而自动适应其改变