Подтвердить что ты не робот

Как визуализировать пробелы в точках в WPF RichTextBox?

Мне нужен способ рендеринга регулярного пространства, неиспользуемого пространства и некоторых других символов форматирования (например, слева направо), как это делает MS Word, когда вы выбираете показывать непечатаемые символы.

Я попробовал два подхода:

1) Замените символы редко используемыми символами. Он работает, но в этом случае мы теряем "неустойчивое" поведение нерушимого пространства (и метки LTR и RTL также перестают работать)

2) Используйте собственный шрифт

Это позволяет сохранить особое поведение неразрушающего пространства и метки LTR/RTL, но по какой-то странной причине WPF отображает неразрывное пространство с обычным глифом пространства.

WinForms RichTextBox правильно отображает текст с тем же шрифтом.

Эта проблема может быть решена с использованием другого шрифта с другим пространственным глифом для пробелов и неразрывных пространств, но метки LTR и RTL вообще не отображаются вообще, даже если я добавляю для них глиф.

Есть ли у вас какие-либо идеи о том, как я мог бы визуализировать эти символы с видимым глифом, сохраняя их "LTR", "RTL", "неубедительное" поведение?

4b9b3361

Ответ 1

Я не пробовал ничего подобного до сих пор, но могу представить два варианта:

Предупреждение → Я не пробовал

Первый метод:

  • Создайте подкласс UIElement
  • Получить стиль с помощью ControlTemplate для Richtextbox и добавить его в App.xaml
  • Добавьте экземпляр вашего подкласса UIElement внутри внутренней панели Scrollviewer из RichTextBox ControlTemplate
  • Сделать RTBox доступным для свойства зависимостей в вашем классе с помощью DataBinding в ControlTemplate (если возможно) или любым другим способом, выполняющим работу
  • В вашем подклассе UIElement вы повторяете символы документа
  • Нарисуйте символ в своем Adorner для каждого пространства и LineBreak, с которым вы сталкиваетесь
  • Получить значение Rect персонажа в определенной позиции с помощью RichTextBox. Используйте этот прямоугольник для размещения символов.

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

Второй метод:

  • Создать пользовательского Adorner
  • Украсьте RTBox пользовательским Adorner
  • От Adorner вы должны иметь доступ к Ребенку RTBox
  • В вашем подклассе UIElement вы повторяете символы документа
  • Нарисуйте символ в вашем UIElement для каждого пространства и LineBreak, с которым вы сталкиваетесь
  • Я помню, что есть возможность получить Rect персонажа в определенной позиции с RichTextBox. Используйте этот прямоугольник для размещения символов.

Он также без подкласса RTBox. Вы также не можете настроить интервал. В отличие от метода 1, другие разработчики сразу узнают, что эта функциональность была добавлена. Единственным недостатком является то, что вам также придется обрабатывать прокрутку.

Ответ 2

Вы можете попробовать вставить близлежащий видимый глиф LTR/RTL вместо замены.

Ответ 3

Сохраняйте все значения в качестве их специальных символов. Похоже, что ваши функции печати должны обрабатывать: a) какой выходной сигнал пользователь хочет, b) интерпретировать массив данных/массивную строку символов и выплевывать значения в отношении того, что пользователь хочет видеть. Вы не даете слишком много подробностей о том, как ваши вещи хранятся, но это было бы очень разумным способом обойти вещи.