Мой Win2D CanvasControl не изменяет размер автоматически в зависимости от размеров своего содержимого. (УВП)

Поэтому я создаю текстовый редактор через Win2D, чтобы обойти ограничения RichEditBox игровой формы UWP. В основном у меня есть CanvasControl, который я использую для рисования текста с помощью метода args.DrawingSession.DrawTextLayout() события Draw.

Проблема в том, что CanvasControl не изменяет свой размер, чтобы вместить содержимое, которое рисуется внутри него. Есть ли функция, которую я не могу включить, или это нужно делать вручную при каждом вызове обработчика событий Draw? Каков наиболее эффективный подход к решению этой проблемы? Спасибо!


person LeBrown Jones    schedule 05.12.2019    source источник


Ответы (1)


CanvasTextLayout.LayoutBounds.Height — это описание высоты рендеринга внутри CanvasControl, но это не высота самого элемента управления CanvasControl (на самом деле CanvasControl.Height всегда показывает NaN в отладке).

Только когда свойство Height CanvasControl больше, чем высота ScrollViewer, будет отображаться полоса прокрутки.

Поэтому после рендеринга текста вы можете вручную установить Height из CanvasControl.

// render code
// ...
double height = textLayout.LayoutBounds.Height;
canvasControl.Height = height;

С наилучшими пожеланиями.

person Richard Zhang - MSFT    schedule 06.12.2019
comment
Спасибо за ответ. Я использую такой подход. Я использую canvasTextLayout.LayoutBounds.Height в качестве высоты для моего CanvasControl. Я устанавливаю его во время вызова события Draw после настройки и стилизации текста. Я понял, что это может работать таким образом, но все еще задавался вопросом, правильный ли это подход. Для меня не имеет смысла, что сам CanvasControl не имеет возможности изменять свой размер в зависимости от ширины/высоты своего содержимого. Я полагал, что как только я вызову args.DrawingSession.DrawTextLayout(), размер CanvasControl должен измениться в зависимости от содержимого. Так что я думаю, что я делаю это правильно - person LeBrown Jones; 06.12.2019
comment
Re: Для меня не имеет смысла то, что сам CanvasControl не имеет возможности изменять свой размер в зависимости от ширины/высоты своего содержимого. - с точностью до наоборот; Ожидается, что код, выполняющий рисование, будет рисовать на основе размера холста, вообще говоря. Если вам нужен контейнер, размер которого соответствует вашему содержимому, Canvas — неподходящая модель композиции. - person Sander; 06.12.2019
comment
Можете ли вы уточнить? Есть ли другой подход, который вы бы использовали для того, что я делаю? Я пришел к выводу (каким-то образом), что API-интерфейсы рисования текста Win2D хороши для разработки редактора. И ЕСЛИ это правда, то сам редактор должен изменить размер, чтобы он соответствовал своему собственному текстовому содержимому. - person LeBrown Jones; 06.12.2019
comment
CanvasControl в качестве элемента управления рендерингом не предназначен для изменения размера в зависимости от содержимого, такого как Panel. Внутри Panel находятся элементы управления. Когда приложение визуализируется, высота элементов управления является вычисляемой, что повлияет на расположение других элементов управления. Внутренний рендеринг CanvasControl не обязательно является Control. Хотя высота отрисовки может быть рассчитана внутренне, она не обязательно влияет на размер самого элемента управления (например, перекрытие текста). - person Richard Zhang - MSFT; 06.12.2019