Как создать синтаксический файл AvalonEdit (.xshd) и вставить его в мою сборку?

Я пытаюсь определить некоторые пользовательские правила подсветки для AvalonEdit. Кажется, для этого нет никакой документации - есть некоторая документация по формату файла, но ничего о том, как на самом деле загрузить и использовать определение после его создания.

в "синтаксис" wiki-страница (для старого текстового редактора WinForms) документы, как загрузить определения подсветки из a .xshd-файл на диске, но я бы предпочел встроить его в качестве ресурса, так же, как AvalonEdit делает со своими встроенными определениями.

Я просмотрел код в ICSharpCode.Проект AvalonEdit, который загружает встроенные маркеры, но фактический код "загрузка из ресурса" выполняется в DefaultHighlightingManager.LoadHighlighting, который является частным-и который, чтобы сделать вещи более странными, по-видимому, называется только в сборках выпуска.

Я могу продолжать возиться, копировать / вставлять некоторые из кода из частных методов и пытаться cobble что-то вместе, что может или не может работать, но, кажется, стоит спросить:что это стандартный способ сделать это? есть ли рекомендуемый способ для стороннего кода загрузить определение выделения из ресурса?


Дэниел дал мне хорошее начало, но вам нужно включить имя пространства имен в строку, которую вы передаете 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").

для тех, кто следует вдоль дома, the .файл xshd должен иметь действие сборки, установленное для Embedded Resource.

4 ответов


Вы можете использовать статические методы в классе 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 в отладочных сборках (так что ошибки в них сразу замечаются), но задержка-загружает их в сборках выпуска.


для чего это стоит, если вы используете 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

Я лично предпочитаю способ Даррена регистрации вашего определения подсветки с помощью 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"/>

когда я использовал 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);
            }
        }