如何在Win2D中计算一段文字的大小

问题描述 投票:0回答:3

我正在使用 Win2D 为 Windows 10 编写一个应用程序,并且我正在尝试绘制一个可动态缩放的形状以适应其中恰好包含的任何文本。

我想做的是计算出给定 CanvasTextFormat 的特定字符串有多大,然后用它来设置形状的大小。

我的问题是我似乎找不到一种方法来计算字符串有多大?

c# windows win2d
3个回答
16
投票

请参阅下面的代码来计算所需的尺寸(查找“theRectYouAreLookingFor”)

private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
    CanvasDrawingSession drawingSession = args.DrawingSession;
    float xLoc = 100.0f;
    float yLoc = 100.0f;
    CanvasTextFormat format = new CanvasTextFormat {FontSize = 30.0f, WordWrapping = CanvasWordWrapping.NoWrap};        
    CanvasTextLayout textLayout = new CanvasTextLayout(drawingSession, "Hello World!", format, 0.0f, 0.0f);
    Rect theRectYouAreLookingFor = new Rect(xLoc + textLayout.DrawBounds.X, yLoc + textLayout.DrawBounds.Y, textLayout.DrawBounds.Width, textLayout.DrawBounds.Height);
    drawingSession.DrawRectangle(theRectYouAreLookingFor, Colors.Green, 1.0f);
    drawingSession.DrawTextLayout(textLayout, xLoc, yLoc, Colors.Yellow);
}

5
投票

如果您创建的

CanvasTextLayout
requestedWidth
0
(如
Michael Vach
的示例),您可能需要在 Win2D 1.23 中禁用自动换行。喜欢:

var textLayout = new CanvasTextLayout(drawingSession, "Hello World!", fontFormat, 0.0f, 0.0f) {
            WordWrapping = CanvasWordWrapping.NoWrap
};
var completeOuterSize = textLayout.LayoutBounds

(我不可以发表评论)


0
投票

Win2D 的 Windows App SDK 1.5 (WinUI 3) 风格的更新,其语法略有不同(因为当然是这样):

    public Size MeasureString(
        ICanvasResourceCreator canvas,
        string text, 
        string fontFamily, 
        float fontSize)
    {            
        using (var format = new CanvasTextFormat
        {
            FontFamily = fontFamily,
            FontSize = fontSize,
            HorizontalAlignment = CanvasHorizontalAlignment.Left,
            // etc
        })
        using (var layout = new CanvasTextLayout(
            canvas, 
            text, 
            format, 
            float.PositiveInfinity, 
            float.PositiveInfinity))
        {
            return new Size(layout.LayoutBounds.Width, layout.LayoutBounds.Height);
        }            
    }
© www.soinside.com 2019 - 2024. All rights reserved.