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

时间:2011-02-20 13:11:08

标签: syntax-highlighting avalonedit

我正在尝试为AvalonEdit定义一些自定义突出显示规则。似乎没有任何关于此的文档 - 有some documentation on the file format,但没有关于如何在创建后实际加载和使用该定义。

Syntax highlighting”wiki页面(对于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像AvalonEdit一样。内置定义。

我查看了加载其内置荧光笔的ICSharpCode.AvalonEdit项目中的代码,但实际的“资源加载”代码是在DefaultHighlightingManager.LoadHighlighting中完成的,这是私有的 - 并且要制作weirder,显然只在发布版本中调用。

我可以不停地摸索,从私有方法中复制/粘贴一些代码,并尝试将可能或可能不起作用的东西拼凑在一起,但似乎值得问一下:标准的方法是什么?这样做?第三方代码是否建议从资源加载突出显示定义?


Daniel's answer给了我一个良好的开端,但是你需要在传递给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文件需要将其Build Action设置为Embedded Resource。

5 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分:4)

对于它的价值,如果你使用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

答案 2 :(得分:4)

我个人更喜欢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"/>

答案 3 :(得分: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);
            }
        }

答案 4 :(得分:0)

创建一个资源字符串并将其命名为“ xshd”,然后在内容中输入所需内容。 接下来使用以下简单代码:

XmlReader xshdres = XmlReader.Create(new MemoryStream(Encoding.Unicode.GetBytes(Properties.Resources.xshd)));
textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshdres, HighlightingManager.Instance);

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