Partilhar via


Assinando um evento

Este passo a passo explica como criar uma janela de ferramenta que responde a eventos em uma tabela de documento em execução (RDT). Uma janela de ferramenta hospeda um controle de usuário que implementa IVsRunningDocTableEventso . O AdviseRunningDocTableEvents método conecta a interface aos eventos.

Subscrever eventos RDT

Para criar uma extensão com uma janela de ferramenta

  1. Crie um projeto chamado RDTExplorer usando o modelo VSIX e adicione um modelo de item de janela de ferramenta personalizado chamado RDTExplorerWindow.

    Para obter mais informações sobre como criar uma extensão com uma janela de ferramenta, consulte Criando uma extensão com uma janela de ferramenta.

Para se inscrever em eventos RDT

  1. Abra o arquivo RDTExplorerWindowControl.xaml e exclua o botão chamado button1. Adicione um ListBox controle e aceite o nome padrão. O elemento Grid deve ter esta aparência:

    <Grid>
        <StackPanel Orientation="Vertical" Margin="-10,10,10,0">
            <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock>
            <ListBox x:Name="listBox" Height="100" />
        </StackPanel>
    </Grid>
    
  2. Abra o arquivo RDTExplorerWindow.cs na visualização de código. Adicione as seguintes diretivas de uso ao início do arquivo.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Modifique a classe para que, além de derivar da ToolWindowPane classe, ela implemente a RDTExplorerWindow IVsRunningDocTableEvents interface.

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. Implementar IVsRunningDocTableEvents.

    • Implemente a interface . Coloque o cursor no nome IVsRunningDocTableEvents. Você deve ver uma lâmpada na margem esquerda. Clique na seta para baixo à direita da lâmpada e selecione Implementar interface.
  5. Em cada método na interface, substitua a linha throw new NotImplementedException(); por esta:

    return VSConstants.S_OK;
    
  6. Adicione um campo de cookie à classe RDTExplorerWindow.

    private uint rdtCookie;
    

    Isso contém o cookie que é retornado pelo AdviseRunningDocTableEvents método.

  7. Substitua o método Initialize() do RDTExplorerWindow para registrar eventos RDT. Você sempre deve obter serviços no método Initialize() do ToolWindowPane, não no construtor.

    protected override void Initialize()
    {
        IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)
        this.GetService(typeof(SVsRunningDocumentTable));
        rdt.AdviseRunningDocTableEvents(this, out rdtCookie);
    }
    

    O SVsRunningDocumentTable serviço é chamado para obter uma IVsRunningDocumentTable interface. O AdviseRunningDocTableEvents método conecta eventos RDT a um objeto que implementa IVsRunningDocTableEvents, neste caso, um objeto RDTExplorer.

  8. Atualize o método Dispose() do RDTExplorerWindow.

    protected override void Dispose(bool disposing)
    {
        // Release the RDT cookie.
        IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)
            Package.GetGlobalService(typeof(SVsRunningDocumentTable));
        rdt.UnadviseRunningDocTableEvents(rdtCookie);
    
        base.Dispose(disposing);
    }
    

    O UnadviseRunningDocTableEvents método exclui a conexão entre RDTExplorer e notificação de evento RDT.

  9. Adicione a seguinte linha ao corpo do OnBeforeLastDocumentUnlock manipulador, logo antes da return instrução.

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Adicione uma linha semelhante ao corpo do OnAfterFirstDocumentLock manipulador e a outros eventos que você deseja ver na caixa de listagem.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Compile o projeto e comece a depuração. A instância experimental do Visual Studio é exibida.

  12. Abra o RDTExplorerWindow (View / Other Windows / RDTExplorerWindow).

    A janela RDTExplorerWindow é aberta com uma lista de eventos vazia.

  13. Abra ou crie uma solução.

    À medida OnBeforeLastDocument que os OnAfterFirstDocument eventos são disparados, a notificação de cada evento aparece na lista de eventos.