当 TLP 自动调整大小时,自动调整停靠在 TableLayoutPanel 中的标签
Autosize a Label docked in a TableLayoutPanel when the TLP auto-sizes
我在 TableLayoutPanel 中有许多控件和一个用作视觉分隔线的标签。
最小工作示例:
table 有一行,其内容设置为 Autosize
。
在设计模式下,如果我调整大按钮的高度 - 或删除它 - table 会根据小按钮的高度调整大小。
红色分隔线(标签)对行高没有影响,因为它停靠(DockStyle.Left
)。
一切都很好。直到 运行-time.
如果在 运行 时,大按钮改变大小或被移除,TableLayoutPanel 保持相同大小,其高度仍设置为标签(红色分隔线)!
尽管分隔线已对接,table 仍坚持考虑其高度!
我该如何解决这个问题?
重现问题的说明:
下载示例项目from my Dropbox。
运行 项目(来自源代码或使用提供的 executable)。
单击大按钮,它会自动隐藏。
请注意 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
我在 TableLayoutPanel 中有许多控件和一个用作视觉分隔线的标签。
最小工作示例:
table 有一行,其内容设置为 Autosize
。
在设计模式下,如果我调整大按钮的高度 - 或删除它 - table 会根据小按钮的高度调整大小。
红色分隔线(标签)对行高没有影响,因为它停靠(DockStyle.Left
)。
一切都很好。直到 运行-time.
如果在 运行 时,大按钮改变大小或被移除,TableLayoutPanel 保持相同大小,其高度仍设置为标签(红色分隔线)!
尽管分隔线已对接,table 仍坚持考虑其高度!
我该如何解决这个问题?
重现问题的说明:
下载示例项目from my Dropbox。
运行 项目(来自源代码或使用提供的 executable)。
单击大按钮,它会自动隐藏。
请注意 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