WPF Control в небольшом контейнере - PullRequest
1 голос
/ 18 июля 2009

У меня есть эта проблема. Мне нужно знать размер, который пытается использовать Label, но, поскольку элемент управления, который содержит его, меньше, чем фактическая метка, когда я вызываю label.ActualWidth, то, что я действительно получаю, - это ширина указанного элемента управления контейнера. Есть ли способ получить ширину, которая потребуется метке, чтобы соответствовать ее содержимому (без учета ее фактической ширины)? Что-то вроде 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 ]

3 голосов
/ 20 июля 2009

Вот ответ:

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

Обратите внимание, что для вас это не приведет к автоматическому переносу текста.

1 голос
/ 18 июля 2009

Один из способов сделать это - измерить длину текста, используя ширину символа. Следующий метод выполняет это:

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;
    }
...