2013-06-21 139 views
1

背景:奇怪的标签自动调整大小的问题调整

我有放置在用户控件,然后放置在SplitContainer的一个TableLayoutPanel。行以编程方式添加.TableLayoutPanel被锚定为Top | Left | Right,因此在添加行后,其高度将被重新计算并向下展开。

在TableLayoutPanel里面,有2列。第一列的大小是绝对的,第二列的大小是自动大小

在每个单元格中都有一个标签。在第二列的所有标签的定义如下:

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第2列的宽度设置完全相同,因此所有 文本都显示在一行中。
  2. 由一个像素和用户控件被调整大小分配器距离的变化: 宽度减小时,标签应调整大小和在标签中的文本换行
  3. 标签未调整大小和文本的第二线未示出,它也可能不换行(会有在文本位置改变中的标签,如果是这样的话)
  4. 一个像素分配器距离的变化再次和用户控件被调整大小: 宽度进一步减小
  5. 标签调整大小所有权利和所有文本显示,包装

同样的事情发生在TableLayoutPanel的宽度增加时,但总是只有当一个像素有差别时(包装/不包装文本)。

此外,更改码头和/或锚和/或标签的边框样式属性不起作用(我大概尝试了所有可能的组合...)

该图展示的问题一点: enter image description here

+0

我注意到你设置'Anchor'和左'码头= DockStyle.None' ......有没有原因?码头应该帮助这一点。 – DonBoitnott

+0

我在一开始就试过这个。没有区别。 – Arie

+0

您正在给布局引擎冲突的说明。你说标签应该自动调整AutoSize = true。但是,也可以说它应该使用Anchor属性来观察容器的大小。这往往会导致双稳态布局,因为布局请求有两种解决方案。可能在你的情况下更多,因为你也使柱子自动调整大小。你需要摆脱这种模糊性。首先通过切换锚点。 –

回答

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