首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AvalonEdit:级联HighlightingColorizers

AvalonEdit:级联HighlightingColorizers
EN

Stack Overflow用户
提问于 2012-01-25 02:35:57
回答 1查看 2.7K关注 0票数 67

我想级联AvalonEdit的SyntaxHighlighting引擎。我有两个HighlightingDefinitions。第一个是主要语法。第二种是复杂的多行预处理标记语言。由于这个原因,在第一个语法中嵌入第二个语法太复杂了。更简单的方法是呈现第一个语法,然后更改受影响的行部分(基于第二个语法)。

所以我用第二种语言实例化了一个新的HighlightingColorizer,并将其添加到LineTransformers中。但是第二种语言使用预处理器指令对整个文档进行着色,而不仅仅是行部分:非预处理器代码是黑色的。

当我调试第二行转换器的ColorizeLine-method时,未突出显示的代码(=无预处理器代码)的行没有像预期的那样着色。但是线条的颜色是黑色的。

那么,在开始着色之前,HighlightingColorizer会重新设置整个文档之前的所有突出显示吗?

或者还有什么问题呢?如何正确地级联2个HighlightingColorizers

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-19 01:51:28

问题是HighlightingColorizer不直接存储对DocumentHighlighter的引用,而是通过TextView.Services存储它。这样做是为了允许将相同的着色器附加到多个编辑器,以便每个编辑器都有自己的DocumentHighlighter

当您附加第二个着色器时,它会覆盖存储在服务容器中的IHighlighter;两个着色器最终都会使用新的荧光笔。

还要注意,HtmlClipboard中的“复制到剪贴板”逻辑直接访问IHighlighter服务,它不使用任何着色器。(将文本复制到Word仅保留语法突出显示,而不保留折叠标记等其他转换)

基本上有两种方法来解决这个问题:

  1. 不会将额外的高亮笔存储为服务。为此,您可以创建自己的HighlightingColorizer类副本,并使用该类中的字段而不是访问textView.Services。这是一个简单的更改,但是在将文本复制到clipboard.
  2. Create时,将不会使用额外的高亮工具。这是我们在SharpDevelop 5中用于C#语义高亮显示的方法,它作为一个额外的高亮工具扩展了现有的基于.xshd的C#高亮显示。然而,这种方法很复杂(在给定部分的排序和嵌套约束的情况下,合并HighlightedLine并非易事),并且需要对IHighlighter接口进行API更改以处理OnHighlightStateChanged通知(AvalonEdit 4.x使用嵌套在HighlightingColorizer中的派生类来访问此回调;AvalonEdit 5.0将使用事件)。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8992137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档