在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平台中计算文本维度呢?
答案 0 :(得分:27)
在UWP中,您创建TextBlock
,设置其属性(例如Text
,FontSize
),然后调用其Measure
方法并传入无限大小。< / p>
var tb = new TextBlock { Text = "Text", FontSize = 10 };
tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
之后,其DesiredSize
属性包含TextBlock将具有的大小。
答案 1 :(得分:3)
以下是使用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);
<子> Source 子>
答案 2 :(得分:0)
如果您在UWP中遇到问题且Size
无法解决或无法正常使用双重问题。这可能是因为您使用的是System.Drawing.Size
。
改为使用Windows.Foundation.Size
。