J'essaie de créer une coloration syntaxique dans VS2010 pour un format de fichier personnalisé. Après avoir volé beaucoup de l'exemple Ook! Language sur msdn, je suis capable de mettre en évidence les mots-clés dans le fichier. Je suis content avec ça. Toutefois, cet exemple divise SnapshotSpans par Line. J'aimerais également gérer les surlignements multilignes (par exemple, les commentaires). Après le débogage à travers les appels à ma méthode GetTags définie, il semble que la méthode est appelée plusieurs fois par fichier, mais reçoit la même collection SnapshotSpan. Et, puisque chaque caractère tapé provoque une autre série d'appels, il est très difficile de traiter ce qui lui est passé. Alors, que dois-je attendre dans cette collection?Qu'est-ce que Visual Studio transmet à ses appels ITagger.GetTags?
Répondre
Puisque tout peut consommer votre étiqueteur, il n'y a pas de spécification définie sur ce qui peut être passé à GetTags
. Si vous voulez gérer des informations multi-lignes, c'est quelque chose que votre composant devra analyser lui-même, généralement en réponse aux changements de texte et, si c'est cher, sur un thread d'arrière-plan.
Dans la plupart des cas, lorsque le consommateur est un IWpfTextView
, vous pouvez vous attendre à ce que la collection soit une seule ligne à la fois. Si un changement de texte sur une seule ligne (comme la frappe) affecterait plusieurs lignes, votre tagueur devrait lever TagsChanged
sur la région à mettre à jour.
Le modèle général est décrit un peu dans un blog article I wrote about VS editor fundamentals. L'essentiel est que les consommateurs d'informations de marquage poseront des questions sur ce qui les intéresse, et s'abonner pour modifier les événements du tagueur afin de s'assurer que toutes les informations qu'ils ont collectées sont à jour.
Merci pour votre réponse. C'est utile. Cependant, je suis encore un peu confus sur certains points. Tout d'abord, les cours Tagger à l'Ook! Par exemple, prenez un TextBuffer qui n'est jamais utilisé. À quoi sert ce tampon? Deuxièmement, votre article de blog donne l'impression que je peux définir des intervalles. Comment fais-je exactement cela? Si je ne le fais pas, le SpanCollection consiste-t-il simplement en une travée avec le fichier entier? Merci encore pour votre aide. – ThePurpleMonk