【发布时间】:2013-06-21 13:23:39
【问题描述】:
背景:
我有一个TableLayoutPanel 放在UserControl 中,然后放在SplitContainer 中。以编程方式添加行。 TableLayoutPanel 锚定Top|Left|Right,所以添加行后,重新计算其高度并向下扩展。
在TableLayoutPanel 内,有两列。第一列的大小为Absolute,第二列的大小设置为AutoSize。
在每个单元格中,都有一个Label。第二列所有标签的定义如下:
Label vName = new Label();
vName.AutoSize = true;
vName.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
vName.Margin = new Padding(3);
vName.TextAlign = ContentAlignment.MiddleLeft;
vName.Name = "controlName";
vName.Text = "Some text here";
vName.DoubleClick += new EventHandler(vName_DoubleClick);
vName.Dock = DockStyle.None;
问题:
通常,一切正常,标签调整大小和一切,除了一种奇怪的情况:
- 标签的文字类似于
"immoballizes the device (33.33%)",TableLauoutPanel第二列的宽度是精确设置的,所以所有文字都显示在一行中。 - 分割器距离改变一个像素,
UserControl被调整大小:宽度减小,因此标签应该调整大小,并且标签中的文本应该换行。 - 标签未调整大小,第二行文本未显示,它也可能不换行(如果这样做,标签中的文本位置会发生变化)。
- 分割距离再次改变一个像素,
UserControl的大小被调整:宽度进一步减小。 - 标签大小调整正确,所有文本都显示,换行。
当TableLayoutPanel 的宽度增加时也会发生同样的事情,但总是只有在存在一个像素的差异时(在环绕/不环绕文本之间)。
另外,更改标签的Dock 和/或Anchor 和/或BorderStyle 属性不起作用(我可能尝试了所有可能的组合...)
这张图稍微说明了这个问题:
【问题讨论】:
-
我注意到您设置了
Anchor并离开了Dock = DockStyle.None...有什么原因吗? Dock 应该可以帮助解决这个问题。 -
我一开始就试过这个。没有区别。
-
您向布局引擎提供了相互冲突的指令。您说标签应该使用 AutoSize = true 自动调整大小。但也说它应该用 Anchor 属性观察容器的大小。这往往会导致双稳态布局,因为布局请求有 两个 解决方案。在您的情况下可能更多,因为您还使列自动调整大小。你需要摆脱这种歧义。首先敲击锚点。
-
你说你的
TableLayoutPanel是放在一个UserControl里的,那么它是怎么放置的呢?Anchor还不够,那Dock和它在UserControl中的位置呢?我认为你的整个表单的屏幕截图更能描述你的问题。 -
@Hans Passant,破坏锚点没有帮助。我已经试过了。有趣的是它在所有情况下都可以正常工作,除非换行和不换行文本之间的差异正好是 1 个像素