24

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

语法高亮” wiki 页面(用于旧的 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);
}

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

对于在家中跟随的任何人,.xshd 文件需要将其构建操作设置为嵌入式资源。

4

5 回答 5

28

您可以使用类中的静态方法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(以便立即注意到其中的错误),但在发布版本中延迟加载它们。

于 2011-02-20T14:03:03.100 回答
9

我个人更喜欢 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"/>
于 2017-10-01T12:59:03.857 回答
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
于 2013-10-18T17:30:04.617 回答
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);
            }
        }
于 2014-06-05T04:28:45.610 回答
0

创建一个资源字符串并将其命名为“xshd”,然后在内容中写入您想要的内容。接下来使用这个简单的代码:

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

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

于 2019-07-31T01:49:08.273 回答