我想级联AvalonEdit的SyntaxHighlighting引擎。我有两个HighlightingDefinitions。第一个是主要语法。第二种是复杂的多行预处理标记语言。由于这个原因,在第一个语法中嵌入第二个语法太复杂了。更简单的方法是呈现第一个语法,然后更改受影响的行部分(基于第二个语法)。
所以我用第二种语言实例化了一个新的HighlightingColorizer,并将其添加到LineTransformers中。但是第二种语言使用预处理器指令对整个文档进行着色,而不仅仅是行部分:非预处理器代码是黑色的。
当我调试第二行转换器的ColorizeLine-method时,未突出显示的代码(=无预处理器代码)的行没有像预期的那样着色。但是线条的颜色是黑色的。
那么,在开始着色之前,HighlightingColorizer会重新设置整个文档之前的所有突出显示吗?
或者还有什么问题呢?如何正确地级联2个HighlightingColorizers
发布于 2012-10-19 01:51:28
问题是HighlightingColorizer不直接存储对DocumentHighlighter的引用,而是通过TextView.Services存储它。这样做是为了允许将相同的着色器附加到多个编辑器,以便每个编辑器都有自己的DocumentHighlighter。
当您附加第二个着色器时,它会覆盖存储在服务容器中的IHighlighter;两个着色器最终都会使用新的荧光笔。
还要注意,HtmlClipboard中的“复制到剪贴板”逻辑直接访问IHighlighter服务,它不使用任何着色器。(将文本复制到Word仅保留语法突出显示,而不保留折叠标记等其他转换)
基本上有两种方法来解决这个问题:
HighlightingColorizer类副本,并使用该类中的字段而不是访问textView.Services。这是一个简单的更改,但是在将文本复制到clipboard.HighlightedLine并非易事),并且需要对IHighlighter接口进行API更改以处理OnHighlightStateChanged通知(AvalonEdit 4.x使用嵌套在HighlightingColorizer中的派生类来访问此回调;AvalonEdit 5.0将使用事件)。https://stackoverflow.com/questions/8992137
复制相似问题