背景
我有一个放置在UserControl中的TableLayoutPanel,然后放在SplitContainer中。以编程方式添加行.TableLayoutPanel锚定为Top | Left | Right,因此在添加行之后,将重新计算其高度并向下扩展。
在TableLayoutPanel中,有2列。第一列的大小为Absolute,第二列的大小为AutoSize
在每个细胞中都有一个标签。第二列中的所有标签定义如下:
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;
问题:
通常一切正常,标签调整大小和一切,除了一个奇怪的场景:
当TableLayoutPanel的宽度增加时会发生同样的事情,但是只有在存在一个像素的差异时(包装/不包装文本之间)才会发生相同的事情。
此外,更改标签的Dock和/或Anchor和/或BorderStyle属性不起作用(我可能尝试了所有可能的组合......)
这张图片说明了一点问题:
答案 0 :(得分:1)
显然这是一个标签问题:自动调整时,它没有正确测量文本,有时会出现一个像素差异。我找到了一个奇怪的解决方法,但是,如果有人知道更好的事情,请启发我。
这样我的标签中的文字每次都会正确包装,所有内容都会自动正确地自动调整:
void tableLayoutPanel1_Resize(object sender, EventArgs e)
{
float fWidth = tableLayoutPanel1.GetColumnWidths()[1];
foreach (Control ctr in tableLayoutPanel1.Controls)
{
if (ctr is Label && ctr.Name.Contains("vName_"))
{
// -7 for margins
Size s = TextRenderer.MeasureText(ctr.Text, ctr.Font, new Size((int)fWidth - 7,1000),
TextFormatFlags.VerticalCenter
| TextFormatFlags.Left
| TextFormatFlags.NoPadding
| TextFormatFlags.WordBreak);
if(!ctr.MaximumSize.Equals(s))
ctr.MaximumSize = new Size(s.Width, s.Height);
}
}
}