Единственный способ сделать это - создать собственный элемент управления и переопределить 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» с переносом текста. Это не легкая задача для любого человека, но вышеупомянутый метод даст вам все необходимое.
С уважением,