Procédure pas - à - pas : À l'aide d'une touche de raccourci avec une extension de l'éditeur
Vous pouvez répondre aux touches de raccourci dans votre extension de l'éditeur. La procédure pas - à - pas suivante montre comment ajouter un ornement de vue à un affichage de texte à l'aide d'une touche de raccourci. Cette procédure pas - à - pas est basé sur le modèle d'éditeur d'ornement de la fenêtre d'affichage, elle vous permet d'ajouter l'ornement à l'aide de le + caractère.
Composants requis
Pour exécuter cette procédure, vous devez installer Kit de développement logiciel Visual Studio 2010.
Notes
Pour plus d'informations sur le kit de développement Visual Studio, consultez Étendre la présentation de Visual Studio.Pour savoir comment télécharger le kit de développement Visual Studio, consultez Visual Studio Extensibility Developer Center sur le site Web MSDN.
Créer un projet managé (MEF) managed extensibility framework
Pour créer un projet MEF
Créez un projet d'ornement de la fenêtre d'affichage de l'éditeur. nommez la solution KeyBindingTest.
Ouvrez le fichier source.extension.vsixmanifest dans l'éditeur de manifeste VSIX.
Assurez -vous que le titre d' Content contient un type de contenu composant MEF et qu' Path est défini à KeyBindingTest.dll.
Enregistrez et fermez le fichier Source.extension.vsixmanifest.
ajoutez les références suivantes et le CopyLocal défini à false:
Microsoft.VisualStudio.Editor
Microsoft.VisualStudio.OLE.Interop
Microsoft.VisualStudio.Shell
Microsoft.VisualStudio.TextManager.Interop
supprimez le fichier de classe de KeyBindingTestFactory.
dans le fichier de classe de KeyBindingTest, modifiez le nom de classe à PurpleCornerBox. modifiez le constructeur également. Dans le constructeur, modifiez la ligne :
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest")
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest");
en
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox")
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox");
définir le filtre de commande
le filtre de commande est une implémentation d' IOleCommandTarget, qui gère la commande en instanciant l'ornement.
pour définir le filtre de commande
ajoutez un fichier de classe et nommez-le KeyBindingCommandFilter.
Ajoutez les instructions using suivantes.
Imports System Imports System.Runtime.InteropServices Imports Microsoft.VisualStudio.OLE.Interop Imports Microsoft.VisualStudio Imports Microsoft.VisualStudio.Text.Editor
using System; using System.Runtime.InteropServices; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Text.Editor;
La classe nommée KeyBindingCommandFilter doit hériter d' IOleCommandTarget.
Friend Class KeyBindingCommandFilter Implements IOleCommandTarget
internal class KeyBindingCommandFilter : IOleCommandTarget
Ajoutez des champs privés pour l'affichage de texte, la commande suivante dans la chaîne de commande, et une balise représente si le filtre de commande a déjà été ajouté.
Private m_textView As IWpfTextView Friend m_nextTarget As IOleCommandTarget Friend m_added As Boolean Friend m_adorned As Boolean
private IWpfTextView m_textView; internal IOleCommandTarget m_nextTarget; internal bool m_added; internal bool m_adorned;
ajoutez un constructeur qui définit l'affichage de texte.
Public Sub New(ByVal textView As IWpfTextView) m_textView = textView m_adorned = False End Sub
public KeyBindingCommandFilter(IWpfTextView textView) { m_textView = textView; m_adorned = false; }
Implémentez la méthode d' QueryStatus() comme suit.
Private Function QueryStatus(ByRef pguidCmdGroup As Guid, ByVal cCmds As UInteger, ByVal prgCmds() As OLECMD, ByVal pCmdText As IntPtr) As Integer Implements IOleCommandTarget.QueryStatus Return m_nextTarget.QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText) End Function
int IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText) { return m_nextTarget.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText); }
Implémentez la méthode d' Exec() afin qu'elle ajoute une zone violet à la vue si a + caractère est tapé.
Private Function Exec(ByRef pguidCmdGroup As Guid, ByVal nCmdID As UInteger, ByVal nCmdexecopt As UInteger, ByVal pvaIn As IntPtr, ByVal pvaOut As IntPtr) As Integer Implements IOleCommandTarget.Exec If m_adorned = False Then Dim typedChar As Char = Char.MinValue If pguidCmdGroup = VSConstants.VSStd2K AndAlso nCmdID = CUInt(VSConstants.VSStd2KCmdID.TYPECHAR) Then typedChar = CChar(ChrW(Marshal.GetObjectForNativeVariant(pvaIn))) If typedChar.Equals("+"c) Then Dim TempPurpleCornerBox As PurpleCornerBox = New PurpleCornerBox(m_textView) m_adorned = True End If End If End If Return m_nextTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut) End Function
int IOleCommandTarget.Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) { if (m_adorned == false) { char typedChar = char.MinValue; if (pguidCmdGroup == VSConstants.VSStd2K && nCmdID == (uint)VSConstants.VSStd2KCmdID.TYPECHAR) { typedChar = (char)(ushort)Marshal.GetObjectForNativeVariant(pvaIn); if (typedChar.Equals('+')) { new PurpleCornerBox(m_textView); m_adorned = true; } } } return m_nextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); }
ajouter le fournisseur de filtre de commande
Le fournisseur d'ornements doit ajouter un filtre de commande à l'affichage de texte. Dans cet exemple, le fournisseur implémente IVsTextViewCreationListener pour écouter les événements de création d'affichage de texte. Ce fournisseur d'ornements exporte également la couche d'ornement, qui définit l'ordre de plan de l'ornement.
pour ajouter le fournisseur de filtre de commande
ajoutez un fichier de classe et nommez-le KeyBindingFilterProvider.
Ajoutez les instructions using suivantes.
Imports System Imports System.Collections.Generic Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio Imports Microsoft.VisualStudio.OLE.Interop Imports Microsoft.VisualStudio.Utilities Imports Microsoft.VisualStudio.Editor Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.TextManager.Interop
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using Microsoft.VisualStudio; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Utilities; using Microsoft.VisualStudio.Editor; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.TextManager.Interop;
Ajoutez une classe nommée KeyBindingFilterProvider qui hérite d' IVsTextViewCreationListener, et exportez-la avec un type de contenu « texte » et un TextViewRoleAttribute d' Editable.
<Export(GetType(IVsTextViewCreationListener)), ContentType("text"), TextViewRole(PredefinedTextViewRoles.Editable)> Friend Class KeyBindingCommandFilterProvider Implements IVsTextViewCreationListener
[Export(typeof(IVsTextViewCreationListener))] [ContentType("text")] [TextViewRole(PredefinedTextViewRoles.Editable)] internal class KeyBindingCommandFilterProvider : IVsTextViewCreationListener
ajoutez la définition de couche d'ornement.
<Export(GetType(AdornmentLayerDefinition)), Name("PurpleCornerBox"), Order(), TextViewRole(PredefinedTextViewRoles.Editable)> Friend keybindingAdornmentLayer As AdornmentLayerDefinition
[Export(typeof(AdornmentLayerDefinition))] [Name("PurpleCornerBox")] [Order()] [TextViewRole(PredefinedTextViewRoles.Editable)] internal AdornmentLayerDefinition keybindingAdornmentLayer;
Pour obtenir l'adaptateur de vue de texte, vous devez importer IVsEditorAdaptersFactoryService.
<Import(GetType(IVsEditorAdaptersFactoryService))> Friend editorFactory As IVsEditorAdaptersFactoryService = Nothing
[Import(typeof(IVsEditorAdaptersFactoryService))] internal IVsEditorAdaptersFactoryService editorFactory = null;
Implémentez la méthode d' VsTextViewCreated afin qu'elle ajoute KeyBindingCommandFilter.
Public Sub VsTextViewCreated(ByVal textViewAdapter As IVsTextView) Implements IVsTextViewCreationListener.VsTextViewCreated Dim textView As IWpfTextView = editorFactory.GetWpfTextView(textViewAdapter) If textView Is Nothing Then Return End If AddCommandFilter(textViewAdapter, New KeyBindingCommandFilter(textView)) End Sub
public void VsTextViewCreated(IVsTextView textViewAdapter) { IWpfTextView textView = editorFactory.GetWpfTextView(textViewAdapter); if (textView == null) return; AddCommandFilter(textViewAdapter, new KeyBindingCommandFilter(textView)); }
Le gestionnaire d' AddCommandFilter obtient l'adaptateur de vue de texte et ajoute le filtre de commande.
Private Sub AddCommandFilter(ByVal viewAdapter As IVsTextView, ByVal commandFilter As KeyBindingCommandFilter) If commandFilter.m_added = False Then 'get the view adapter from the editor factory Dim [next] As IOleCommandTarget Dim hr As Integer = viewAdapter.AddCommandFilter(commandFilter, [next]) If hr = VSConstants.S_OK Then commandFilter.m_added = True 'you'll need the next target for Exec and QueryStatus If [next] IsNot Nothing Then commandFilter.m_nextTarget = [next] End If End If End If End Sub
void AddCommandFilter(IVsTextView viewAdapter, KeyBindingCommandFilter commandFilter) { if (commandFilter.m_added == false) { //get the view adapter from the editor factory IOleCommandTarget next; int hr = viewAdapter.AddCommandFilter(commandFilter, out next); if (hr == VSConstants.S_OK) { commandFilter.m_added = true; //you'll need the next target for Exec and QueryStatus if (next != null) commandFilter.m_nextTarget = next; } } }
Génération et test de code
Pour tester ce code, générez la solution de KeyBindingTest et exécutez -la dans l'instance expérimentale.
Pour générer et tester la solution de KeyBindingTest
Générez la solution.
Lorsque vous exécutez ce projet dans le débogueur, une deuxième instance de Visual Studio est instanciée.
Créez ou ouvrez un fichier texte, puis cliquez n'importe où dans l'affichage de texte.
type +.
redimensionnez l'affichage de texte.
Un carré violet doit s'afficher dans le coin supérieur droit de l'affichage de texte.
Voir aussi
Tâches
Procédure pas - à - pas : lier un type de contenu à une extension de nom de fichier