小容器大小的WPF控制

时间:2009-07-17 20:33:14

标签: wpf wpf-controls

我有这个问题。我需要知道Label尝试使用的大小,但由于包含它的控件小于实际标签,当我调用label.ActualWidth时,我真正得到的是所述容器控件的宽度。有没有办法获得标签所需的宽度以适应其内容(忽略其ACTUAL宽度)?像label.RequiredWidth,label.DesiredSize.Width或label.ActualWidth都没有。

以下是我正在尝试的内容:

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

谢谢。

2 个答案:

答案 0 :(得分:3)

以下是答案:

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

请注意,这不会为您执行任何自动文本换行。

答案 1 :(得分: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;
    }