1

背景:

我有一个TableLayoutPanel放在 aUserControl中,然后放在SplitContainer. 以编程方式添加行。TableLayoutPanel是 anchored 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;

问题:

通常,一切正常,标签调整大小和一切,除了一种奇怪的情况:

  1. 标签的文本类似于"immoballizes the device (33.33%)",第二列的宽度TableLauoutPanel是精确设置的,因此所有文本都显示在一行中。
  2. 拆分器距离改变一个像素并且UserControl调整大小:宽度减小,因此标签应该调整大小,并且标签中的文本应该换行。
  3. 标签未调整大小,第二行文本未显示,它也可能不换行(如果这样做,标签中的文本位置会发生变化)。
  4. 分离器距离再次改变一个像素,并且UserControl调整大小:宽度进一步减小。
  5. 标签可以调整大小,所有文本都显示,包装。

TableLayoutPanel' 的宽度增加时也会发生同样的事情,但总是只有在存在一个像素的差异时(在环绕/不环绕文本之间)。

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

这张图稍微说明了这个问题:

在此处输入图像描述

4

1 回答 1

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);
                }
            }
        }
于 2013-06-24T10:50:18.860 回答