TableLayoutPanel上的Strange Label AutoSize问题调整大小

时间:2013-06-21 13:23:40

标签: c# winforms

背景

我有一个放置在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;

问题:

通常一切正常,标签调整大小和一切,除了一个奇怪的场景:

  1. 标签的文字类似于“固定设备 (33.33%)“,TableLauoutPanel column2的宽度设置完全如此 文字显示在一行中。
  2. 拆分器距离改变一个像素并调整UserControl的大小: 宽度减小,标签应调整大小,标签中的文字应该换行
  3. 标签没有调整大小,第二行文字没有显示,它也可能不会换行(如果是这样的话,标签中的文本位置会有变化)< / LI>
  4. 拆分器距离再次改变一个像素,并调整UserControl的大小: 宽度进一步减少
  5. 标签调整大小,所有文字都显示,包装
  6. 当TableLayoutPanel的宽度增加时会发生同样的事情,但是只有在存在一个像素的差异时(包装/不包装文本之间)才会发生相同的事情。

    此外,更改标签的Dock和/或Anchor和/或BorderStyle属性不起作用(我可能尝试了所有可能的组合......)

    这张图片说明了一点问题: enter image description here

1 个答案:

答案 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);
                }
            }
        }