如何创建AvalonEdit语法文件(.xshd)并将其嵌入到我的程序集中?

Joe*_*ite 22 syntax-highlighting avalonedit

我正在尝试为AvalonEdit定义一些自定义突出显示规则.似乎没有任何相关的文档 - 有关于文件格式一些文档,但没有关于如何在创建它之后实际加载和使用该定义的文档.

" 语法高亮 "维基页面(对于旧的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);
}
Run Code Online (Sandbox Code Playgroud)

然后我就可以打电话了ResourceLoader.LoadHighlightingDefinition("Name.xshd").

对于在家中跟随的任何人,.xshd文件需要将其Build Action设置为Embedded Resource.

Dan*_*iel 27

您可以使用类中的静态方法ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader来加载.xshd文件.例如:

using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
    using (XmlTextReader reader = new XmlTextReader(s)) {
        textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
    }
}
Run Code Online (Sandbox Code Playgroud)

AvalonEdit本身的加载代码很奇怪,因为它急切地在调试版本中加载xshds(以便立即注意到它们中的错误),但是在发布版本中延迟加载它们.

  • 很酷 - 比我一起攻击简单得多.除非您在资源名称中包含命名空间,否则它将获得NullReferenceException.我将用我最终解决的解决方案更新问题. (2认同)

Mas*_*peh 8

我个人更喜欢 Darren 使用 注册您的突出显示定义的方式RegisterHighlighting,然后您可以像其他内置定义一样在 XAML 中使用它。

C#

public partial class App : Application
{
    public App()
    {
        using (var stream = new System.IO.MemoryStream(WpfApp15.Properties.Resources.sql))
        {
            using (var reader = new System.Xml.XmlTextReader(stream))
            {
                ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.RegisterHighlighting("SQL", new string[0],
                    ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader,
                        ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance));
            }
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

XAML

<avalon:TextEditor SyntaxHighlighting="SQL"/>
Run Code Online (Sandbox Code Playgroud)


Dar*_*ren 5

值得的是,如果您使用的是F#,这是一个代码片段,可用于注册xshd文件。

let registerHighlighting() =
    try
        // Load our custom highlighting definition
        match System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("GSLhighlighting.xshd") with
            | null -> failwithf "ERROR: could not find embedded resource"
            | s ->
                use reader = new XmlTextReader(s)
                let gslHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader, HighlightingManager.Instance)
                // and register it in the HighlightingManager
                HighlightingManager.Instance.RegisterHighlighting("GSL", [| ".gsl" |], gslHighlighting)
                editor.SyntaxHighlighting <- gslHighlighting
    with _ as exn ->
        printfn "ERROR: %s" exn.Message
Run Code Online (Sandbox Code Playgroud)