Passo a passo: Usando uma tecla de atalho com uma extensão de Editor
Você pode responder a teclas de atalho na sua extensão de editor. A instrução a seguir mostra como adicionar um adorno de modo de exibição para um modo de exibição de texto usando uma tecla de atalho. Esta explicação passo a passo é baseada no modelo visor adorno editor e permite que você adicione o adorno usando o caractere +.
Pré-requisitos
Para concluir este passo a passo, você deve instalar o SDL do Visual Studio 2010.
Dica
Para obter mais informações sobre o SDK de Visual Studio, consulte Ampliando a visão geral de Visual Studio.Para descobrir como fazer o download do SDK do Visual Studio, consulte Visual Studio extensibilidade Developer Center no site do MSDN.
Criando um projeto do Framework (MEF) de extensibilidade gerenciada
Para criar um projeto MEF
Crie um projeto de adorno de visor do Editor. Nomeie a solução KeyBindingTest.
Abra o arquivo de source.extension.vsixmanifest no Editor de VSIX de manifesto.
Certifique-se de que o Content título contém um tipo de conteúdo do componente MEF e que o Path for definido como KeyBindingTest.dll.
Salve e feche o Source.extension.vsixmanifest.
Adicione as seguintes referências e defina CopyLocal para false:
Microsoft.VisualStudio.Editor
Microsoft.VisualStudio.OLE.Interop
Microsoft.VisualStudio.Shell
Microsoft.VisualStudio.TextManager.Interop
Exclua o arquivo de classe KeyBindingTestFactory.
No arquivo de classe KeyBindingTest, altere o nome da classe para PurpleCornerBox. Altere também o construtor. Dentro do construtor, altere a linha:
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest")
_adornmentLayer = view.GetAdornmentLayer("KeyBindingTest");
para
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox")
_adornmentLayer = view.GetAdornmentLayer("PurpleCornerBox");
Definir o filtro de comando
O filtro de comando é uma implementação de IOleCommandTarget, que lida com o comando instanciando o adorno.
Para definir o filtro de comando
Adicione um arquivo de classe e denomine- KeyBindingCommandFilter.
Adicione o seguinte usando instruções.
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;
A classe chamada KeyBindingCommandFilter, deve herdar da IOleCommandTarget.
Friend Class KeyBindingCommandFilter Implements IOleCommandTarget
internal class KeyBindingCommandFilter : IOleCommandTarget
Adicione campos privados para o modo de exibição de texto, o comando seguinte na cadeia de comando e um sinalizador para representar se o filtro de comando já foi adicionado.
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;
Adicione um construtor que defina o modo de exibição de texto.
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; }
Implementar a QueryStatus() método da seguinte maneira.
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); }
Implementar a Exec() método, de modo que ele adiciona uma caixa de roxa no modo de exibição se um + caractere é digitado.
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); }
Adicionando o provedor de filtro de comando
O provedor de adorno deve adicionar um filtro de comando no modo de exibição de texto. Neste exemplo, o provedor implementa IVsTextViewCreationListener para ouvir eventos de criação do modo de exibição de texto. Este provedor de adorno também exporta a camada de adorno, que define a ordem z do adorno.
Para adicionar o provedor de filtro de comando
Adicione um arquivo de classe e denomine- KeyBindingFilterProvider.
Adicione o seguinte usando instruções.
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;
Adicionar uma classe chamada KeyBindingFilterProvider que herda de IVsTextViewCreationListenere exportá-lo com um tipo de conteúdo de "texto" e um TextViewRoleAttribute de 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
Adicione a definição de camada de adorno.
<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;
Para obter o adaptador de exibição de texto, você deve importar o IVsEditorAdaptersFactoryService.
<Import(GetType(IVsEditorAdaptersFactoryService))> Friend editorFactory As IVsEditorAdaptersFactoryService = Nothing
[Import(typeof(IVsEditorAdaptersFactoryService))] internal IVsEditorAdaptersFactoryService editorFactory = null;
Implementar a VsTextViewCreated método, de modo que ele adiciona o 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)); }
O AddCommandFilter manipulador obtém o adaptador de exibição de texto e adiciona o filtro de comando.
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; } } }
Criar e testar o código
Para testar esse código, crie a solução de KeyBindingTest e execute-o na instância experimental.
Para criar e testar a solução de KeyBindingTest
Crie a solução.
Ao executar este projeto no depurador, uma segunda instância do Visual Studio é instanciada.
Criar ou abrir um arquivo de texto e, em seguida, clique em qualquer lugar no modo de exibição de texto.
Tipo +.
Redimensione o modo de exibição de texto.
Um quadrado roxo deve aparecer no canto superior direito da exibição de texto.
Consulte também
Tarefas
Passo a passo: Vinculação a um tipo de conteúdo a uma extensão de nome de arquivo