我正在尝试为 AvalonEdit 定义一些自定义突出显示规则。似乎没有任何相关文档——有有关文件格式的一些文档 http://www.codeproject.com/KB/edit/AvalonEdit.aspx,但没有介绍创建定义后如何实际加载和使用该定义。
The "语法高亮 http://wiki.sharpdevelop.net/Syntax%20highlighting.ashx“ wiki 页面(针对旧的 WinForms TextEditor)记录了如何从磁盘上的 .xshd 文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像 AvalonEdit 对其内置定义所做的那样。
我查看了 ICSharpCode.AvalonEdit 项目中加载其内置荧光笔的代码,但实际的“从资源加载”代码是在 DefaultHighlightingManager.LoadHighlighting 中完成的,它是私有的 - 并且让事情变得更奇怪,显然仅在发布版本中调用。
我可以继续摸索,复制/粘贴私有方法中的一些代码,并尝试将可能有效或无效的东西拼凑在一起,但似乎值得一问:执行此操作的标准方法是什么?是否有推荐的方法让第三方代码从资源加载突出显示定义?
丹尼尔的回答 https://stackoverflow.com/questions/5057210/how-do-i-create-an-avalonedit-syntax-file-xshd-and-embed-it-into-my-assembly/5057464#5057464给了我一个良好的开端,但您需要在传递给 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 文件需要将其“构建操作”设置为“嵌入式资源”。