Как рассчитать размер куска текста в Win2D

Я пишу приложение для Windows 10 с использованием Win2D, и я пытаюсь нарисовать фигуру, которая динамически масштабируется, чтобы соответствовать любому тексту, который в ней находится.

Что я хотел бы сделать, так это выяснить, насколько большой будет конкретная строка с данным CanvasTextFormat, а затем использовать это, чтобы установить размер формы.

Моя проблема в том, что я не могу найти способ выяснить, насколько большой будет строка?


person DomAyre    schedule 07.06.2015    source источник


Ответы (2)


См. Код ниже, чтобы рассчитать требуемый размер (ищите "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);
}
person Michael Vach    schedule 19.06.2015
comment
Я обнаружил, что свойство LayoutBounds CanvasTextLayout более полезно для меня, чем DrawBounds. Возможно, другие тоже. - person Keith Murray; 20.10.2016
comment
Можно ли получить размер без DrawingSession? Я хочу изменить размер холста в зависимости от высоты текста. - person Brad B.; 27.09.2020

Если вы создаете 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

(Мне не разрешено комментировать)

person Jan Diederich    schedule 20.09.2018
comment
Тебе не нужно извиняться. Существенное улучшение существующего ответа в любом случае заслуживает отдельного ответа. Более того, вы не сможете красиво отформатировать код в комментарии. Итак, основные образцы кода всегда должны входить в ответ. Кстати. если вы хотите сослаться на другой ответ (или вопрос), вы можете нажать share ссылку и использовать ее в своем тексте. - person Adrian W; 20.09.2018