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

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

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

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

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


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

27 голосов
/ 20 февраля 2011

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

5 голосов
/ 18 октября 2013

Для чего стоит, если вы используете 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
4 голосов
/ 01 октября 2017

Я лично предпочитаю, чтобы Даррен зарегистрировал ваше определение подсветки с помощью 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));
            }
        }
    } 
}

1010 * XAML *

<avalon:TextEditor SyntaxHighlighting="SQL"/>
3 голосов
/ 05 июня 2014

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