我正在尝试为AvalonEdit定义一些自定义突出显示规则。没有任何关于此的文档 -- 对于文件格式有一些文档, 但是没有关于创建后如何加载和使用定义的说明。
"Syntax highlighting"维基页面(适用于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我更愿意像AvalonEdit内置定义一样将其嵌入资源。
我查看了ICSharpCode.AvalonEdit项目中加载内置高亮显示器的代码,但实际的“从资源加载”代码是在DefaultHighlightingManager.LoadHighlighting中完成的,该方法是私有的 -- 更奇怪的是,它似乎只在发布版本中调用。
我可以继续摸索,从私有方法中复制/粘贴一些代码,并尝试拼凑出可能有效或无效的东西,但询问似乎是值得的:这个标准方法是什么? 有没有推荐的方法供第三方代码从资源中加载突出显示定义?
"Syntax highlighting"维基页面(适用于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我更愿意像AvalonEdit内置定义一样将其嵌入资源。
我查看了ICSharpCode.AvalonEdit项目中加载内置高亮显示器的代码,但实际的“从资源加载”代码是在DefaultHighlightingManager.LoadHighlighting中完成的,该方法是私有的 -- 更奇怪的是,它似乎只在发布版本中调用。
我可以继续摸索,从私有方法中复制/粘贴一些代码,并尝试拼凑出可能有效或无效的东西,但询问似乎是值得的:这个标准方法是什么? 有没有推荐的方法供第三方代码从资源中加载突出显示定义?
丹尼尔的回答给了我一个好的开始,但是你需要在传递给GetManifestResourceStream的字符串中包含命名空间名称--如果不这样做,你会得到一个NullReferenceException(因为它返回一个null流)。
最终,我添加了一个名为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文件需要将其Build Action设置为嵌入式资源。