我在尝试用作垂直堆叠面板(没有水平滚动条,只有垂直)的 TableLayoutPanel 中看到奇怪的行为。
我在这里设置了一个停靠在表单右侧的 TableLayoutPanel。我删除了默认创建的额外行和列样式。列样式大小类型将为百分比 (100%)。行样式大小类型将是 AutoSize。我已将 AutoScroll 设置为 true,将 CellBorderStyle 设置为 Single,因为此问题仅在设置此属性时发生。
以下是按钮的相关代码:
private void Button1_Click(System.Object sender, System.EventArgs e)
{
Panel p = new Panel();
p.Dock = DockStyle.Fill;
p.BorderStyle = BorderStyle.FixedSingle;
this.tableLayoutPanel1.Controls.Add(p);
}
private void Button2_Click(System.Object sender, System.EventArgs e)
{
do
{
this.tableLayoutPanel1.PerformLayout();
} while (this.tableLayoutPanel1.HorizontalScroll.Visible);
}
这是解释问题的图片。
图 1 - 我单击了一次 Button1,将一个完全停靠的面板添加到 TableLayoutPanel。
图 2 - 我又点击了 Button1 四次,得到 5 个完全停靠的面板并导致出现水平滚动条。在这一点上,我不明白为什么出现的垂直滚动条没有在停靠的面板上移动,因此没有水平滚动条。
图 3 - 我单击了一次 Button2,导致该循环运行,奇怪的是,每次 PerformLayout 调用都会将停靠面板的宽度减小 1,最终导致水平滚动条消失。
问题
为什么我添加第五个Panel时,会出现水平滚动条?每个面板都停靠,所以我不明白为什么当垂直滚动条出现时它不会导致面板宽度减少垂直滚动条宽度(就像停靠面板应该表现的那样)。
布局引擎发生了什么导致它在每次 PeformLayout 调用后将宽度减小 1?我怀疑这是一个与 CellBorderStyle 属性设置为 Single 相关的错误。
我的第三个问题,实际上对我自己来说最重要的问题是:获得一个可靠的、垂直堆叠的面板的最佳方式是什么,其中每行有 1 个控件,并且它的大小完全取决于父容器的宽度?解决方案绝不应出现水平滚动条。最好是开箱即用的解决方案(无自定义控件)。