Как измерить размер текста в приложениях UWP?

В WPF это было возможно с помощью FormattedText, например:

private Size MeasureString(string candidate)
{
    var formattedText = new FormattedText(
        candidate,
        CultureInfo.CurrentUICulture,
        FlowDirection.LeftToRight,
        new Typeface(this.textBlock.FontFamily, this.textBlock.FontStyle, this.textBlock.FontWeight, this.textBlock.FontStretch),
        this.textBlock.FontSize,
        Brushes.Black);

    return new Size(formattedText.Width, formattedText.Height);
}

Но в UWP этот класс больше не существует. Итак, как можно рассчитать размеры текста в универсальной платформе Windows?

Ответ 1

В UWP вы создаете TextBlock, TextBlock его свойства (например, Text, FontSize), а затем вызываете метод Measure и передаете бесконечный размер.

var tb = new TextBlock { Text = "Text", FontSize = 10 };
tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));

После этого его свойство DesiredSize содержит размер, который будет иметь TextBlock.

Ответ 2

Вот альтернативный подход с использованием Win2D:

private Size MeasureTextSize(string text, CanvasTextFormat textFormat, float limitedToWidth = 0.0f, float limitedToHeight = 0.0f)
{
    var device = CanvasDevice.GetSharedDevice();

    var layout = new CanvasTextLayout(device, text, textFormat, limitedToWidth, limitedToHeight);

    var width = layout.DrawBounds.Width;
    var height = layout.DrawBounds.Height;

    return new Size(width, height);
}

Вы можете использовать его следующим образом:

string text = "Lorem ipsum dolor sit amet";

CanvasTextFormat textFormat = new CanvasTextFormat
{
    FontSize = 16,
    WordWrapping = CanvasWordWrapping.WholeWord,
};

Size textSize = this.MeasureTextSize(text, textFormat, 320.0f);

Источник

Ответ 3

Если у вас возникли проблемы с UWP, при этом Size не будет разрешаться или работать корректно с помощью double. Вероятно, это потому, что вы используете System.Drawing.Size.

Вместо этого используйте Windows.Foundation.Size.