2010-12-01 20 views
3

Comment ajouter/supprimer du code dans l'éditeur de code à partir d'une extension?Ajouter du code à la fenêtre de l'éditeur en cours dans le package/l'extension Visual Studio

Par exemple:
J'ai créé une sorcière d'extension modifie le code à partir d'une prise d'entrée
L'exemple utilise Microsoft.VisualStudio.Text.Editor

essayé d'utiliser:

IWpfTextView textView; // got from visual studio "Create" event ITextChange change; // Got from network socket or other source

ITextEdit edit = textView.TextBuffer.CreateEdit(); // Throws "Not Owner" Exception edit.Delete(change.OldSpan); edit.Insert(change.NewPosition, change.NewText);

Mais Je suppose qu'il y a un autre moyen parce que la fonction CrateEdit() échoue

+0

Pouvez-vous envoyer le message d'erreur complet? – JaredPar

+0

Erreur: Vous avez tenté d'éditer TextBuffer sur le mauvais thread. Et "textView.TextBuffer.TakeThreadOwnership();" throws: Vous avez tenté de modifier le fil d'édition de TextBuffer. –

Répondre

3

Le problème ici est que vous essayez d'effectuer une modification sur un ITextBuffer à partir d'un thread différent de celui qui le possède. Ce n'est simplement pas possible. ITextBuffer Les instances sont affinitaires à un thread particulier une fois que la première modification a eu lieu et après ce point, elles ne peuvent plus être éditées à partir d'un thread différent. La méthode TakeThreadOwnership échouera également après que le ITextBuffer a été affinitisé. La plupart des autres méthodes de non-édition (CurrentSnapshot par exemple) peuvent être appelées depuis n'importe quel thread.

Généralement, un ITextBuffer sera affinitisé au thread d'interface utilisateur Visual Studio. Pour effectuer l'édition, utilisez l'instance SynchronizationContext.Current d'origine ou Dispatcher.CurrentDispatcher du fil de l'interface utilisateur pour revenir à l'unité d'exécution de l'interface utilisateur, puis effectuez la modification.

+0

J'ai compris! : D Merci! –

0

Voici le code que je figure sur

Dispatcher.Invoke(new Action(() => 
     { 

      ITextEdit edit = _view.TextBuffer.CreateEdit(); 
      ITextSnapshot snapshot = edit.Snapshot; 

      int position = snapshot.GetText().IndexOf("text:"); 
      edit.Delete(position, 5); 
      edit.Insert(position, "some text"); 
      edit.Apply(); 
     }));