2009-07-17 10 views
1

この問題があります。私はLabelが使用しようとしているサイズを知る必要がありますが、それを含むコントロールは実際のラベルよりも小さいので、label.ActualWidthを呼び出すと実際にはコンテナコントロールの幅になります。ラベルに内容を収めるために必要な幅を得る方法はありますか(ACTUALの幅は無視します)? 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

をここに答えがあります。

+0

これはずっと簡単です。ありがとう。 – Carlo

1

一つの方法は、グリフの幅を使用して、テキストの長さを測定することであろう。次のような方法があること実現:これはあなたのための任意のテキストの自動折り返しをしないだろうということ

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

注:

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

+1

受け入れ答えよりも複雑であることに加えて、この例では、使用中の書体は、複合フォント(例:_「グローバル・モノスペース」_、_「グローバル・サンセリフ」_などからであるときのサイズを計算するために失敗します。 ) –

関連する問題