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
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
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>
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;
Modifique a classe para que, além de derivar da ToolWindowPane classe, ela implemente a
RDTExplorerWindow
IVsRunningDocTableEvents interface.public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
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.
Em cada método na interface, substitua a linha
throw new NotImplementedException();
por esta:return VSConstants.S_OK;
Adicione um campo de cookie à classe RDTExplorerWindow.
private uint rdtCookie;
Isso contém o cookie que é retornado pelo AdviseRunningDocTableEvents método.
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.
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.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; }
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; }
Compile o projeto e comece a depuração. A instância experimental do Visual Studio é exibida.
Abra o RDTExplorerWindow (View / Other Windows / RDTExplorerWindow).
A janela RDTExplorerWindow é aberta com uma lista de eventos vazia.
Abra ou crie uma solução.
À medida
OnBeforeLastDocument
que osOnAfterFirstDocument
eventos são disparados, a notificação de cada evento aparece na lista de eventos.