我正在尝试为 AvalonEdit 定义一些自定义突出显示规则。似乎没有任何文档 - 有一些关于文件格式的文档,但没有关于如何在创建定义后实际加载和使用定义。
“语法高亮” wiki 页面(用于旧的 WinForms TextEditor)记录了如何从磁盘上的 .xshd 文件加载高亮定义,但我宁愿将其作为资源嵌入,就像 AvalonEdit 使用其内置定义一样.
我查看了加载其内置荧光笔的 ICSharpCode.AvalonEdit 项目中的代码,但实际的“从资源加载”代码是在 DefaultHighlightingManager.LoadHighlighting 中完成的,它是私有的 - 并且让事情变得更奇怪,显然只在发布版本中调用。
我可以继续摸索,从私有方法中复制/粘贴一些代码,并尝试拼凑一些可能会或可能不会起作用的东西,但似乎值得问一下:这样做的标准方法是什么?第三方代码是否有推荐的方法从资源中加载突出显示定义?
Daniel 的回答给了我一个良好的开端,但是您需要在传递给 GetManifestResourceStream 的字符串中包含命名空间名称——如果不这样做,您将得到 NullReferenceException(因为它返回一个空流)。
我最终使用以下方法将名为 ResourceLoader 的静态类添加到与 .xshd 文件相同的项目文件夹中:
public static IHighlightingDefinition LoadHighlightingDefinition(
string resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName))
using (var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
然后我就可以打电话了ResourceLoader.LoadHighlightingDefinition("Name.xshd")
。
对于在家中跟随的任何人,.xshd 文件需要将其构建操作设置为嵌入式资源。