Exemplarische Vorgehensweise: Verwenden einer Editor-Erweiterung mit einer Zugriffstaste
Sie können für Zugriffstasten in der Editor Namespaceerweiterung reagieren. Die folgende exemplarische Vorgehensweise zeigt, wie ein zusatzelement Ansicht einer Textansicht hinzufügt, indem eine Zugriffstaste verwendet. Diese exemplarische Vorgehensweise basiert auf der Vorlage zusatzelement-Editor Viewport, und sie können Sie das Zusatzelement hinzufügen, indem Sie + Zeichen verwenden.
Vorbereitungsmaßnahmen
Zum Abschließen dieser exemplarischen Vorgehensweise müssen Sie Visual Studio 2010 SDKinstallieren.
Hinweis
Weitere Informationen über das Visual Studio-SDK finden Sie unter Erweitern von Visual Studio Overview.Um herauszufinden finden Sie unter wie das Visual Studio-SDK, auf Visual Studio Extensibility Developer Center der MSDN-Website herunterlädt.
Ein Projekt des Managed Extensibility Framework (MEF)
So erstellen Sie ein MEF-Projekt
Erstellen Sie ein Projekt Editor-Viewport-Zusatzelement. Geben Sie der Projektmappe KeyBindingTest.
Öffnen Sie die Datei source.extension.vsixmanifest im VSIX-Manifest-Editor.
Überprüfen Sie, ob die Content Überschrift einen MEF-Komponenten-Inhaltstyp enthält und dass Path zu KeyBindingTest.dll festgelegt ist.
Speichern und schließen Sie Source.extension.vsixmanifest.
Fügen Sie die folgenden Verweise hinzu und Festlegen von CopyLocal zu false:
Microsoft.VisualStudio.Editor
Microsoft.VisualStudio.OLE.Interop
Microsoft.VisualStudio.Shell
Microsoft.VisualStudio.TextManager.Interop
Löschen Sie die KeyBindingTestFactory-Klassendatei.
In der KeyBindingTest-Klassendatei ändern Sie den Klassennamen zu PurpleCornerBox. Ändern Sie den Konstruktor. Innerhalb des Konstruktors ändern Sie die Zeile:
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest")
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest");
zu
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox")
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox");
Definieren des Befehls-Filter
Der Filter ist eine Implementierung des Befehls IOleCommandTarget, die den Befehl behandelt, indem das Zusatzelement instanziiert.
Um den Befehl Filter definieren
Fügen Sie eine Klassendatei hinzu, und nennen Sie sie KeyBindingCommandFilter.
Fügen Sie die folgenden using-Anweisungen hinzu.
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;
Die Klasse, die KeyBindingCommandFilter benannt wird, muss von IOleCommandTargeterben.
Friend Class KeyBindingCommandFilter Implements IOleCommandTarget
internal class KeyBindingCommandFilter : IOleCommandTarget
Fügen Sie private Felder hinzu, damit die Textansicht, in den folgenden Befehl in die Befehlskette und einem Flag darstellt, ob der Filter Befehls bereits hinzugefügt wurde.
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;
Fügen Sie einen Konstruktor hinzu, der die Textansicht festlegt.
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; }
Implementieren Sie die QueryStatus()-Methode wie folgt.
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); }
Implementieren Sie die Exec()-Methode, sodass sie purpurrotes ein Feld hinzugefügt wird, wenn die Ansicht " a + Zeichen eingegeben wird.
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); }
Hinzufügen des Befehls-Filter-Anbieter
Der Anbieter muss einen Befehl Zusatzelement Filter der Textansicht auf Hinzufügen. In diesem Beispiel implementiert der Anbieter IVsTextViewCreationListener , um zu überwachen, um Ereignisse zu simsen Builds anzeigen. Dieser Anbieter Zusatzelement exportiert ebenfalls die Zusatzelementebene, die die Z-Reihenfolge des Zusatzelements definiert.
Um den Befehl Anbieter Filter hinzufügen
Fügen Sie eine Klassendatei hinzu, und nennen Sie sie KeyBindingFilterProvider.
Fügen Sie die folgenden using-Anweisungen hinzu.
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;
Fügen Sie eine Klasse hinzu, die KeyBindingFilterProvider benannt wird, die von IVsTextViewCreationListenererbt, und exportieren Sie sie mit dem Inhaltstyp „Text“ und TextViewRoleAttribute von 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
Fügen Sie die Definition Zusatzelement Ebenen hinzu.
<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;
Um den Text abzurufen, müssen Sie die Netzwerkkarten IVsEditorAdaptersFactoryServiceimportieren.
<Import(GetType(IVsEditorAdaptersFactoryService))> Friend editorFactory As IVsEditorAdaptersFactoryService = Nothing
[Import(typeof(IVsEditorAdaptersFactoryService))] internal IVsEditorAdaptersFactoryService editorFactory = null;
Implementieren Sie die VsTextViewCreated-Methode, sodass sie KeyBindingCommandFilterhinzugefügt wird.
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)); }
Der Handler ruft den Text AddCommandFilter die Netzwerkkarten ab und fügt den Filter Befehls hinzu.
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; } } }
Erstellen und Testen von Code
Um diesen Code zu testen, erstellen Sie die KeyBindingTest-Projektmappe und führen Sie sie in der experimentellen Instanz aus.
So erstellen und testen die KeyBindingTest-Projektmappe
Erstellen Sie die Projektmappe.
Wenn Sie dieses Projekt im Debugger ausführen, wird eine zweite Instanz von Visual Studio instanziiert.
Erstellen oder öffnen Sie eine Textdatei, und klicken Sie dann auf eine beliebige Stelle in der Textansicht.
Typ +.
Ändern Sie die Textansicht zulässige Größe.
Ein purpurrotes Quadrat sollte in der oberen rechten Ecke der Textansicht angezeigt werden.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Verknüpfen einer Dateinamenerweiterung eines Inhaltstyps