Текст, который следует / обрезает форму? - PullRequest
5 голосов
/ 04 января 2012

Хорошо, поэтому я знаю, как обрезать текст к определенной геометрии, однако текст автоматически не переносится на основе клипа, так как можно добиться эффекта, подобного показанному ниже, учитывая, что у вас есть «галочка» как геометрия / путь?

Это случай ручного добавления текстовых полей, подходящих для каждой строки, а затем разбиения текста на основе того, что будет / не будет соответствовать?

Example image

1 Ответ

1 голос
/ 04 января 2012

Единственный способ сделать это - создать собственный элемент управления и переопределить OnRender. Этот пользовательский элемент управления будет иметь геометрию, определяющую его область клипа, и свойство «Текст» типа string. Это также будет иметь свойство lineheight типа int.

В OnRender вы можете измерить текст, который должен быть нарисован в текущем местоположении X, Y (начиная с верхнего левого угла геометрии клипа. Измерьте этот текст по одному слову за раз и посмотрите, полностью ли ограничивающий прямоугольник слова в геометрии клипа. Это возможно с помощью API-интерфейса HitTest Geometry и проверки того, что все четыре точки ограничивающего прямоугольника слова находятся внутри геометрии. Если это так, нарисуйте это слово, если нет, увеличьте X на один интервал и измерьте снова. Если вы дойдете до края элемента управления, сбросьте X на ноль и увеличьте Y на один пробел и повторите, используя подход Scanline, аналогичный тому, как телевизор рисует свои пиксели.

По сути, вы пытаетесь создать свой собственный WrapPanel или TextBlock с переносом текста. Если вы можете, я бы вызвал Reflector или ILSpy в WPF Framework для просмотра кода в WrapPanel / TextBlock или поиска статей по «Кодированию пользовательской WrapPanel» / «TextBlock» / «RichTextControl» с переносом текста. Это не легкая задача для любого человека, но вышеупомянутый метод даст вам все необходимое.

С уважением,

...