当 TLP 自动调整大小时,自动调整停靠在 TableLayoutPanel 中的标签

Autosize a Label docked in a TableLayoutPanel when the TLP auto-sizes

我在 TableLayoutPanel 中有许多控件和一个用作视觉分隔线的标签。

最小工作示例:

table 有一行,其内容设置为 Autosize

在设计模式下,如果我调整大按钮的高度 - 或删除它 - table 会根据小按钮的高度调整大小。
红色分隔线(标签)对行高没有影响,因为它停靠(DockStyle.Left)。

一切都很好。直到 运行-time.

如果在 运行 时,大按钮改变大小或被移除,TableLayoutPanel 保持相同大小,其高度仍设置为标签(红色分隔线)!
尽管分隔线已对接,table 仍坚持考虑其高度!

我该如何解决这个问题?


重现问题的说明:

问题:
在 TableLayoutPanel 中,标签用作两个列之间的分隔符。

  • 标签停靠在其单元格上。
  • 唯一的Row的RowStyle设置为SizeType.AutoSize
  • Label的Cell对应的Column的样式似乎设置为SizeType.AutoSize,其他Column的样式似乎设置为SizeType.AutoSize

在设计类型中,当托管在另一个单元格中的控件被隐藏或删除时,TableLayoutPanel 会缩小到剩余控件的大小,并且标签似乎也会相应地调整其高度。
或者,至少,这是看起来发生的事情。
部分取决于 .Net 版本,TableLayoutPanel 和 Label 可能同意同时缩小。但这种行为可能不会重复多次。
当布局首次应用于所有受影响的控件时,窗体设计器和 运行-time LayoutEngine 的行为可能不同。
如果控件再次显示然后删除,在设计时,TableLayoutPanel 很可能会拒绝第二次收缩。
当项目 运行 然后停止,然后返回到窗体设计器时,可以观察到相同的行为。当其中一个控件被移除时,TableLayoutPanel 将不再缩小:现在应用默认布局,Designer 的引擎将按照 designer.cs 文件中的描述进行操作。

如何解决:
如果实际上需要标签作为 separator:

  • 将标签锚定到所有边或将其停靠到 DockStyle.Fill
  • 将标签 AutoSize 属性 设置为 true (!Important)
  • 将 TableLayoutPanel AutoSize 属性 设置为 true
  • 设置 TableLayoutPanel AutoSizeMode property to GrowAndShrink(!重要)
  • 设置ColumnStyle of all Columns not used as separator to SizeType.AutoSize

如果实际不需要Label,我们可以绘制订阅CellPaint事件的TableLayoutPanel Cells的背景。
这是一个非常简单的操作,标签可以被移除,所以它的布局行为不再是一个问题。

用作分隔符的Cell的大小需要增加标签设置为左右Margin的尺寸,以具有相同的尺寸space.

其余不变

这会用红色填充所有偶数列的单元格背景。
使用标准控件时,此颜色仅在 运行 时可见。它可以在设计时使用在内部实现此行为的自定义控件使其可见。

private void someTableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (e.Column % 2 != 0) {
        e.Graphics.FillRectangle(Brushes.Red, e.CellBounds);
    }
}

这是 运行 时(以及设计时)的样子:

与 TableLayoutPanle 行为相关的其他信息:


Dynamically added rows to a TableLayoutPanel are displayed on a different row position