Compartir a través de


Suscripción a un evento

En este tutorial se explica cómo crear una ventana de herramientas que responda a eventos de una tabla de documentos en ejecución (RDT). Una ventana de herramientas hospeda un control de usuario que implementa IVsRunningDocTableEvents. El AdviseRunningDocTableEvents método conecta la interfaz a los eventos.

Suscribirse a eventos RDT

Para crear una extensión con una ventana de herramientas

  1. Cree un proyecto denominado RDTExplorer mediante la plantilla VSIX y agregue una plantilla de elemento de ventana de herramientas personalizada denominada RDTExplorerWindow.

    Para obtener más información sobre cómo crear una extensión con una ventana de herramientas, consulte Creación de una extensión con una ventana de herramientas.

Para suscribirse a eventos RDT

  1. Abra el archivo RDTExplorerWindowControl.xaml y elimine el botón denominado button1. Agregue un ListBox control y acepte el nombre predeterminado. El elemento Grid debe tener este aspecto:

    <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 el archivo RDTExplorerWindow.cs en la vista de código. Agregue las siguientes directivas using al inicio del archivo.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Modifique la RDTExplorerWindow clase para que, además de derivar de la ToolWindowPane clase , implemente la IVsRunningDocTableEvents interfaz .

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

    • Implementar la interfaz . Coloque el cursor en el nombre IVsRunningDocTableEvents. Debería ver una bombilla en el margen izquierdo. Haga clic en la flecha abajo a la derecha de la bombilla y seleccione Implementar interfaz.
  5. En cada método de la interfaz, reemplace la línea throw new NotImplementedException(); por esta:

    return VSConstants.S_OK;
    
  6. Agregue un campo de cookie a la clase RDTExplorerWindow.

    private uint rdtCookie;
    

    Contiene la cookie devuelta por el AdviseRunningDocTableEvents método .

  7. Invalide el método Initialize() de RDTExplorerWindow para registrarse para eventos RDT. Siempre debe obtener servicios en el método Initialize() de ToolWindowPane, no en el constructor.

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

    Se SVsRunningDocumentTable llama al servicio para obtener una IVsRunningDocumentTable interfaz. El AdviseRunningDocTableEvents método conecta eventos RDT a un objeto que implementa IVsRunningDocTableEvents, en este caso, un objeto RDTExplorer.

  8. Actualice el método Dispose() de RDTExplorerWindow.

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

    El UnadviseRunningDocTableEvents método elimina la conexión entre RDTExplorer y la notificación de eventos RDT.

  9. Agregue la siguiente línea al cuerpo del OnBeforeLastDocumentUnlock controlador, justo antes de la return instrucción .

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Agregue una línea similar al cuerpo del OnAfterFirstDocumentLock controlador y a otros eventos que desee ver en el cuadro de lista.

    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 la solución y comience la depuración. Aparece la instancia experimental de Visual Studio.

  12. Abra RDTExplorerWindow (Ver / Otras ventanas / RDTExplorerWindow).

    Se abre la ventana RDTExplorerWindow con una lista de eventos vacía.

  13. Abra o cree una solución.

    A medida OnBeforeLastDocument que se activan los eventos y OnAfterFirstDocument , la notificación de cada evento aparece en la lista de eventos.