【问题标题】:How do I create an AvalonEdit syntax file (.xshd) and embed it into my assembly?如何创建 AvalonEdit 语法文件 (.xshd) 并将其嵌入到我的程序集中?
【发布时间】:2011-06-30 17:49:39
【问题描述】:

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

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

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

我可以继续摸索,从私有方法中复制/粘贴一些代码,并尝试拼凑一些可能有效也可能无效的东西,但似乎值得问一下:标准的方法是什么?这样做? 是否有推荐的第三方代码从资源中加载突出显示定义的方法?


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 文件需要将其构建操作设置为嵌入式资源。

【问题讨论】:

    标签: syntax-highlighting avalonedit


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      当我将 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);
                  }
              }
      

      【讨论】:

      • 正确使用的一种方法,Assembly.GetManifestResourceStream(..) 您必须将文件附加到您的项目解决方案,然后在属性中将“构建操作”设置为“嵌入式资源”和“复制到输出目录”改为“不要复制”。
      【解决方案3】:

      不管怎样,如果你使用 F#,这是一个用于注册 xshd 文件的代码 sn-p。

      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
      

      【讨论】:

        【解决方案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"/>
        

        【讨论】:

          【解决方案5】:

          您可以使用类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 本身的加载代码很奇怪,因为它在调试版本中急切地加载 xshd(以便立即发现其中的错误),但在发布版本中延迟加载它们。

          【讨论】:

          • 酷——比我一起破解的要简单得多。但是,除非您在资源名称中包含命名空间,否则它会收到 NullReferenceException。我将用我最终得到的解决方案更新问题。
          猜你喜欢
          • 1970-01-01
          • 2011-05-07
          • 2012-06-30
          • 2014-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          相关资源
          最近更新 更多