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

26
我正在尝试为AvalonEdit定义一些自定义突出显示规则。没有任何关于此的文档 -- 对于文件格式有一些文档, 但是没有关于创建后如何加载和使用定义的说明。
"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设置为嵌入式资源。

5个回答

29

您可以使用类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);
    }
}

AvalonEdit本身的加载代码很奇怪,因为在调试版本中急切地加载xshds文件(以便立即发现其中的错误),但在发布版本中延迟加载。


2
很酷——比我拼凑出来的东西简单多了。但是,如果不在资源名称中包含命名空间,它会得到一个NullReferenceException。我将使用我找到的解决方案更新问题。 - Joe White

12

我个人更喜欢使用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));
            }
        }
    } 
}

XAML

<avalon:TextEditor SyntaxHighlighting="SQL"/>

如何在代码中使用已注册的语法高亮设置SyntaxHighlighting? - Boppity Bop

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

3
当我使用GetManifestResourceStream读取xshd文件时,我得到了null。我改用了StreamReader:
using (StreamReader s = 
            new StreamReader(@"C:\Users\Smadar.Tsdaka\Documents\ServoStudio\Scripts\ServoStudioSyntax.xshd"))
        {
            using (XmlTextReader reader = new XmlTextReader(s))
            {
                scriptBody.SyntaxHighlighting =
                    ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(
                    reader,
                    HighlightingManager.Instance);
            }
        }

1
正确使用Assembly.GetManifestResourceStream(..)的一种方法是将文件附加到您的项目解决方案中,然后在属性中将“Build Action”设置为“嵌入式资源”,将“Copy to Output Directory”设置为“不复制”。 - Damian

0
创建一个资源字符串,并将其命名为“xshd”,在内容中编写所需内容。 接下来使用以下简单代码:
XmlReader xshdres = XmlReader.Create(new MemoryStream(Encoding.Unicode.GetBytes(Properties.Resources.xshd)));
textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshdres, HighlightingManager.Instance);

textEditor 是 XAML 中 AvalonEdit 文本编辑器的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接