我正在尝试为AvalonEdit定义一些自定义突出显示规则。似乎没有任何文档,有有关文件格式的一些文档< / a>,但是在创建定义后如何实际加载和使用该定义就什么也没有。
"语法突出显示"维基页面(用于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但是我想而是将其作为资源嵌入,就像AvalonEdit使用其内置定义一样。
我查看了ICSharpCode.AvalonEdit项目中的代码,该代码加载了它内置荧光笔,但是实际的"从资源加载"代码是在DefaultHighlightingManager.LoadHighlighting中完成的,它是私有的-而且,使事情变得奇怪的是,它显然仅在发行版本中被调用。
我可以继续摸索,复制/粘贴一些c从私有方法中找到答案,并尝试将可能有用或不可行的东西拼凑在一起,但是似乎值得问:什么是标准方法?方代码从资源中加载突出显示的定义?
Daniel的答案为我提供了一个良好的开端,但是您需要在传递给GetManifestResourceStream的字符串中包含名称空间名称-否则,您将得到NullReferenceException(因为它返回空流)。
我最终使用以下方法将名为ResourceLoader的静态类添加到与.xshd文件相同的项目文件夹中:
公共静态IHighlightingDefinition LoadHighlightingDefinition(
字符串resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace +"。" + resourceName;
使用(var stream = type.Assembly.GetManifestResourceStream(fullName))
使用(var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader,HighlightingManager.Instance);
}
然后我可以调用 ResourceLoader.LoadHighlightingDefinition(" Name.xshd")。
对于在家中跟随的任何人,.xshd文件都需要将其"构建操作"设置为"嵌入式资源"。
解决方案
undefined
Ad byValueimpression
您可以在 ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader < / code>来加载.xshd文件。
例如:
使用(Stream s = myAssembly.GetManifestResourceStream(" MyHighlighting。 xshd")){
使用(XmlTextReader reader = new XmlTextReader(s)){
textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader,HighlightingManager.Instance);
}
}
AvalonEdit本身的加载代码很奇怪,因为它非常渴望在调试版本中加载xshds(以便立即注意到它们中的错误),但在发布版本中延迟加载它们。