2013-06-21 136 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); 
       } 
      } 
     }