Подтвердить что ты не робот

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

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

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

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

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


Ответ Даниэля дал мне хорошее начало, но вам нужно включить имя пространства имен в строку, которую вы передаете GetManifestResourceStream, - если вы этого не сделаете, ll получить исключение 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 необходимо, чтобы его действие сборки было установлено в Embedded Resource.

4b9b3361

Ответ 1

Вы можете использовать статические методы в классе 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

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

Ответ 4

Я лично предпочитаю, чтобы Darren регистрировал ваше определение подсветки с помощью RegisterHighlighting, тогда вы можете использовать его в своем XAML, как и другие встроенные определения.

С#

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"/>