Как измерить размер текста в приложениях 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
.