Comment créer un fichier de syntaxe AvalonEdit (.xshd) et l'intégrer dans mon assemblée?

j'essaie de définir des règles de mise en évidence personnalisées pour AvalonEdit. Il ne semble pas y avoir de documentation pour cela -- il y a de la documentation sur le format de fichier , mais rien sur la façon de charger et d'utiliser la définition une fois que vous l'avez créé.

la" mise en évidence de la syntaxe " page wiki (pour l'ancien WinForms TextEditor) documents comment charger les définitions de mise en évidence à partir d'un .fichier xshd sur disque, mais je plutôt l'intégrer comme une ressource, comme AvalonEdit le fait avec ses définitions intégrées.

j'ai regardé le code dans le ICSharpCode.Le projet AvalonEdit qui charge ses surligneurs intégrés, mais le vrai code "load from resource"est fait dans Defaulthightingmanager.L'observation, qui est privée -- et qui, pour rendre les choses plus étranges, est apparemment seulement appelée dans les constructions de libération.

je peux continuer à tâtonner, copier / coller du code des méthodes privées, et essayer de concocter quelque chose ensemble qui pourrait ou pourrait ne pas fonctionner, mais il semble intéressant de demander: Quelle est la manière standard de faire cela? y a-t-il une façon recommandée pour le code de tiers de charger une définition de mise en évidence à partir d'une ressource?


la réponse de Daniel m'a donné un bon départ, mais vous devez inclure le nom d'espace de noms dans la chaîne à laquelle vous passez GetManifestResourceStream -- si vous ne le faites pas, vous obtiendrez une exception NullReferenceException (parce qu'elle renvoie un flux null).

j'ai fini par ajouter une classe statique appelée ResourceLoader au même dossier de projet que le .fichier xshd, avec cette méthode:

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);
}

alors je peux juste appeler ResourceLoader.LoadHighlightingDefinition("Name.xshd") .

pour quiconque suit à la maison, le .le fichier xshd doit avoir son action de construction définie à la ressource intégrée.

22
demandé sur Community 2011-02-20 16:11:07

4 réponses

Vous pouvez utiliser les méthodes statiques de la classe ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader à charger .fichiers xshd. Par exemple:

using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
    using (XmlTextReader reader = new XmlTextReader(s)) {
        textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
    }
}

le code de chargement dans AvalonEdit lui-même est bizarre car il charge avec empressement les xshds dans les builds de debug (de sorte que les erreurs sont remarquées immédiatement), mais delay-les charge dans les builds de release.

23
répondu Daniel 2014-04-19 13:51:44

pour ce que ça vaut, si vous utilisez F#, c'est un extrait de code qui fonctionne pour enregistrer le fichier 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
répondu Darren 2018-09-22 10:16:45

personnellement , je préfère la façon de Darren d'enregistrer votre définition de mise en évidence en utilisant RegisterHighlighting , alors vous pouvez l'utiliser dans votre XAML comme d'autres définitions intégrées.

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"/>
2
répondu Masood Lapeh 2018-09-22 05:55:11

quand j'ai utilisé GetManifestResourceStream pour un fichier xshd j'ai eu null. J'ai utilisé StreamReader à la place:

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);
            }
        }
2
répondu Smadar 2018-09-22 17:31:34