Sottoscrizione a un evento

Questa procedura dettagliata illustra come creare una finestra degli strumenti che risponde agli eventi in una tabella di documenti in esecuzione (RDT). Una finestra degli strumenti ospita un controllo utente che implementa IVsRunningDocTableEvents. Il AdviseRunningDocTableEvents metodo connette l'interfaccia agli eventi.

Sottoscrizione di eventi RDT

Per creare un'estensione con una finestra degli strumenti

  1. Creare un progetto denominato RDTExplorer usando il modello VSIX e aggiungere un modello di elemento della finestra degli strumenti personalizzato denominato RDTExplorerWindow.

    Per altre informazioni sulla creazione di un'estensione con una finestra degli strumenti, vedere Creazione di un'estensione con una finestra degli strumenti.

Per sottoscrivere eventi RDT

  1. Aprire il file RDTExplorerWindowControl.xaml ed eliminare il pulsante denominato button1. Aggiungere un ListBox controllo e accettare il nome predefinito. L'elemento Grid dovrebbe essere simile al seguente:

    <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. Aprire il file RDTExplorerWindow.cs nella visualizzazione codice. Aggiungere le direttive using seguenti all'inizio del file.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Modificare la RDTExplorerWindow classe in modo che, oltre a derivare dalla ToolWindowPane classe , implementi l'interfaccia IVsRunningDocTableEvents .

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

    • Implementare l'interfaccia . Posizionare il cursore sul nome IVsRunningDocTableEvents. Dovrebbe essere visualizzata una lampadina nel margine sinistro. Fare clic sulla freccia Giù a destra della lampadina e selezionare Implementa interfaccia.
  5. In ogni metodo nell'interfaccia sostituire la riga throw new NotImplementedException(); con questa:

    return VSConstants.S_OK;
    
  6. Aggiungere un campo cookie alla classe RDTExplorerWindow.

    private uint rdtCookie;
    

    Contiene il cookie restituito dal AdviseRunningDocTableEvents metodo .

  7. Eseguire l'override del metodo Initialize() di RDTExplorerWindow per eseguire la registrazione per gli eventi RDT. È consigliabile ottenere sempre i servizi nel metodo Initialize() di ToolWindowPane, non nel costruttore.

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

    Il SVsRunningDocumentTable servizio viene chiamato per ottenere un'interfaccia IVsRunningDocumentTable . Il AdviseRunningDocTableEvents metodo connette gli eventi RDT a un oggetto che implementa IVsRunningDocTableEvents, in questo caso, un oggetto RDTExplorer.

  8. Aggiornare il metodo Dispose() di RDTExplorerWindow.

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

    Il UnadviseRunningDocTableEvents metodo elimina la connessione tra RDTExplorer e la notifica degli eventi RDT.

  9. Aggiungere la riga seguente al corpo del OnBeforeLastDocumentUnlock gestore, subito prima dell'istruzione return .

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Aggiungere una riga simile al corpo del OnAfterFirstDocumentLock gestore e ad altri eventi che si desidera visualizzare nella casella di riepilogo.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Compilare il progetto e avviare il debug. Viene visualizzata l'istanza sperimentale di Visual Studio.

  12. Aprire RDTExplorerWindow (Visualizza/Altre finestre/RDTExplorerWindow).

    Viene visualizzata la finestra RDTExplorerWindow con un elenco di eventi vuoto.

  13. Aprire o creare una soluzione.

    Quando OnBeforeLastDocument vengono generati eventi e OnAfterFirstDocument , la notifica di ogni evento viene visualizzata nell'elenco eventi.