2009-07-17 70 views
1

我有這個問題。我需要知道標籤試圖使用的大小,但由於包含它的控件比實際標籤小,因此當我調用label.ActualWidth時,我真正得到的是所述容器控件的寬度。有沒有辦法獲得標籤所需的寬度以適應其內容(不考慮其實際寬度)?像label.RequiredWidth一樣,label.DesiredSize.Width或label.ActualWidth都不起作用。小容器大小的WPF控件

這裏就是我想:

XAML:

<StackPanel Width="100"> 
    <Label x:Name="aLabel">Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text </Label> 
</StackPanel> 

C#:

aLabel.ActualWidth; // this is 100 like the StackPanel 
aLabel.DesiredSize.Width; // also 100 like the StackPanel 

謝謝。

回答

3

這裏的答案:

lb1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
var requiredSize = lb1.DesiredSize; 

注意,這不會爲你做任何自動文本換行。

1

做到這一點的一種方法是使用字形寬度來測量文本的長度。下面的方法可以實現此目的:

public static double GetGlyphRunWidth(Typeface typeface, string text, int fontSize) 
    { 
     GlyphTypeface glyphTypeface; 
     if (!typeface.TryGetGlyphTypeface(out glyphTypeface)) 
      return 0; 

     ushort[] glyphIndexes = new ushort[text.Length]; 
     double[] advanceWidths = new double[text.Length]; 

     double totalWidth = 0; 
     for (int n = 0; n < text.Length; n++) 
     { 
      ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]]; 
      totalWidth += glyphTypeface.AdvanceWidths[glyphIndex] * fontSize; 
     } 

     return totalWidth; 
    } 
+0

我使用這個尺寸是非常準確的標籤的真正大小(當然添加label.Padding.Left和右)謝謝! – Carlo 2009-07-17 21:06:12

+1

除了被接受的答案更復雜之外,當使用的字體來自複合字體(例如_「Global Monospace」_,_「Global Sans Serif」_等)時,此示例也將無法計算大小。 ) – 2016-04-11 07:35:48