2008-12-23 133 views
37

我想知道是否有更好的方法解決此問題。我想調整一個標籤(垂直)來容納一定數量的文本。我的標籤有一個固定的寬度(在它必須包裹之前寬度約爲60個字符),大約495個像素。字體也是固定尺寸(12點afaik),但文字不是。根據Winforms/C中的文本和字體大小確定標籤大小#

我想要做的是在有「NewLine」或文本必須包裝時增加標籤高度;這個想法是,文本在標籤中是完全可見的。 AutoSize不起作用,因爲它的寬度會增加,而不是高度。

當然,我可以計算NewLines的數量並添加:Newlines * LineHeight,然後-given我可以設置每行60個字符,只需分割字符的數量並根據需要添加儘可能多的LineHeight像素。

我想知道是否有更專業的方式來做到這一點。我的方法太「跛腳」嗎?

在此先感謝。

回答

88

Graphics.MeasureString怎麼樣,超載接受一個字符串,字體和最大寬度?這將返回SizeF,因此您可以將Height四捨五入。

 using(Graphics g = CreateGraphics()) { 
      SizeF size = g.MeasureString(text, lbl.Font, 495); 
      lbl.Height = (int) Math.Ceiling(size.Height); 
      lbl.Text = text; 
     } 
+0

也來自我+1,但來吧! Math.Ceiling?老鼠,遇見榴彈炮。 :) – MusiGenesis 2008-12-23 14:40:49

9

Graphics.MeasureString()可能會幫助你。

這也是使用Control.CreateGraphics()調用的唯一用例之一!

+0

CreateGraphics的另一個用例是什麼?我想不出任何其他。 – MusiGenesis 2008-12-23 14:28:13

+0

我說「只有一個」,以防萬一有另一個,但我認爲它是唯一的一個。說實話,我只是喋喋不休的鮑勃鮑威爾的GDI常見問題。 – Quibblesome 2008-12-23 15:22:03

+0

我能想到的另一個唯一的方法就是創建自定義圖形,當您將另一個窗口拖到它們上方時會自動消失,但這更多的是誤用案例。 :) – MusiGenesis 2008-12-23 16:12:18

33

System.Drawing.Graphics有一個可用於此目的的MeasureString方法。使用帶有字符串,字體和int「寬度」參數的重載;最後一個參數指定字符串允許的最大寬度 - 使用此參數的標籤設置寬度。

MeasureString返回一個SizeF對象。使用此返回對象的Height屬性來設置標籤的高度。

注意:要獲得一個用於此目的的Graphics對象,可以調用this.CreateGraphics。

0

那麼60個字符可能對您的測試文本有效,但並非所有字符都具有相同的寬度。例如,比較
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

他們都有60個字符,並且尚未有極大不同寬度。

0

使用TextRenderer類來測量字符串(如在Marc的響應中)而不是通過創建Graphics對象等工作有什麼缺點嗎?

2

這個「答案」是爲了將來的參考和對抗AutoSize = true的初始假設,意味着它(WinForms標籤)永遠不會高度增長。

以下鏈接顯示AutoSize = true與其他屬性(如MaximumSize)的各種影響。根據問題的預期用途,可能需要遵循這些方法之一。

http://blogs.msdn.com/jfoscoding/articles/478299.aspx

4
Size maxSize = new Size(495, int.MaxValue); 
_label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height; 
0

根據this article你應該如果你要使用的最終輸出一個Windows窗體控件使用TextRenderer。 TextRenderer和Graphics.MeasureString會給出不同的結果,所以使用匹配最終輸出模式的結果。

0

在某些情況下,您必須使用緊湊框架,該框架沒有用於MeasureString()的重寫方法,您可以考慮自己計算高度。

private int YukseklikAyarla(string p, Font font, int maxWidth) 
    { 
     int iHeight = 0; 
     using (Graphics g = CreateGraphics()) 
     { 
      var sizes = g.MeasureString(p, font); // THE ONLY METHOD WE ARE ALLOWED TO USE 
      iHeight = (int)Math.Round(sizes.Height); 
      var multiplier = (int)Math.Round((double)sizes.Width)/maxWidth; // DIVIDING THE TEXT WIDTH TO SEE HOW MANY LINES IT CAN HAS 
      if (multiplier > 0) 
      { 
       iHeight = (int)(iHeight * (multiplier + 1)); // WE ADD 1 HERE BECAUSE THE TEXT ALREADY HAS A LINE 
      } 
     } 
     return iHeight; 
    }