Freigeben über


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

  1. Erstellen Sie ein Projekt Editor-Viewport-Zusatzelement. Geben Sie der Projektmappe KeyBindingTest.

  2. Öffnen Sie die Datei source.extension.vsixmanifest im VSIX-Manifest-Editor.

  3. Überprüfen Sie, ob die Content Überschrift einen MEF-Komponenten-Inhaltstyp enthält und dass Path zu KeyBindingTest.dll festgelegt ist.

  4. Speichern und schließen Sie Source.extension.vsixmanifest.

  5. 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

  6. 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

  1. Fügen Sie eine Klassendatei hinzu, und nennen Sie sie KeyBindingCommandFilter.

  2. 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;
    
  3. Die Klasse, die KeyBindingCommandFilter benannt wird, muss von IOleCommandTargeterben.

    Friend Class KeyBindingCommandFilter
        Implements IOleCommandTarget
    
    internal class KeyBindingCommandFilter : IOleCommandTarget
    
  4. 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;
    
  5. 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;
    }
    
  6. 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);
    }
    
  7. 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

  1. Fügen Sie eine Klassendatei hinzu, und nennen Sie sie KeyBindingFilterProvider.

  2. 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;
    
  3. 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
    
  4. 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;
    
  5. 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;
    
  6. 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));
    }
    
  7. 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

  1. Erstellen Sie die Projektmappe.

  2. Wenn Sie dieses Projekt im Debugger ausführen, wird eine zweite Instanz von Visual Studio instanziiert.

  3. Erstellen oder öffnen Sie eine Textdatei, und klicken Sie dann auf eine beliebige Stelle in der Textansicht.

  4. 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