Ответ 1
Проблема заключается в том, что HighlightingColorizer
не сохраняет прямую ссылку на DocumentHighlighter
, а сохраняет ее через TextView.Services
. Это делается для того, чтобы добавить один и тот же колоризатор в несколько редакторов, чтобы каждый редактор получал свой собственный DocumentHighlighter
.
Когда вы присоединяете второй колоризатор, он перезаписывает IHighlighter
, хранящийся в контейнере службы; и оба колоризатора заканчиваются использованием нового маркера.
Также обратите внимание, что логика "копировать в буфер обмена" в HtmlClipboard
напрямую обращается к службе IHighlighter
, она не использует никаких колоризаторов. (копирование текста в Word сохраняет только подсветку синтаксиса, никаких других преобразований, таких как метки метки)
Существует два подхода к решению этой проблемы:
-
Не храните дополнительный маркер в качестве службы. Вы можете сделать это, создав собственную копию класса
HighlightingColorizer
и используйте поле в этом классе вместо доступа кTextView.Services
. Это простое изменение, но дополнительные выделения не будут использоваться при копировании текста в буфер обмена. -
Создайте реализацию
IHighlighter
, которая объединяетHighlightedLine
с несколькимиDocumentHighlighter
s. Это тот подход, который мы используем для семантической подсветки С# в SharpDevelop 5, который работает как дополнительный маркер, который расширяет существующее выделение С# на основе .xshd. Однако этот подход является сложным (объединениеHighlightedLine
является нетривиальным, учитывая ограничения порядка и вложения в разделах) и требует изменения API для интерфейсаIHighlighter
для обработки уведомленияOnHighlightStateChanged
(AvalonEdit 4.x использует производный класс, вложенный вHighlightingColorizer
, чтобы получить доступ к этому обратному вызову, AvalonEdit 5.0 будет использовать событие).