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