How to calculate the size of a piece of text in Win2D
Asked Answered
A

2

12

I am writing an application for Windows 10 using Win2D and I'm trying to draw a shape which scales dynamically to fit whatever text happens to be in it.

What I'd like to do is work out how big a particular string would be with a given CanvasTextFormat and then use that to set the size of the shape.

My problem is I can't seem to find a way of working out how big the string will be?

Aggiornamento answered 7/6, 2015 at 18:12 Comment(0)
F
16

See code below to calculate the required size (look for "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);
}
Felisha answered 19/6, 2015 at 11:38 Comment(2)
I did find the LayoutBounds property of CanvasTextLayout to be more useful to me than DrawBounds. Perhaps others will as well.Saari
Is it possible to get the size without a drawingSession? I want to size my canvas based on the height of text.Alfie
T
6

If you create a CanvasTextLayout with a requestedWidth of 0, like in the example of Michael Vach, you may want to disable Word Wrap in Win2D 1.23. Like:

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

(I'm not allowed to comment)

Tenantry answered 20/9, 2018 at 15:48 Comment(1)
You don't need to apologize. A substantial improvement of an existing answer is worth a separate answer anyway. Moreover, you would not be able to format the code nicely in a comment. So, major code samples should always go into an answer. Btw. if you want to refer to another answer (or question) you can hit the share link and use that in your text.Grotesquery

© 2022 - 2024 — McMap. All rights reserved.