Abonnieren eines Ereignisses

In dieser exemplarischen Vorgehensweise wird erläutert, wie Sie ein Toolfenster erstellen, das auf Ereignisse in einer ausgeführten Dokumenttabelle (RDT) reagiert. Ein Toolfenster hostet ein Benutzersteuerelement, das implementiert IVsRunningDocTableEventswird. Die AdviseRunningDocTableEvents Methode verbindet die Schnittstelle mit den Ereignissen.

Abonnieren von RDT-Ereignissen

So erstellen Sie eine Erweiterung mit einem Toolfenster

  1. Erstellen Sie ein Projekt mit dem Namen RDTExplorer mithilfe der VSIX-Vorlage, und fügen Sie eine benutzerdefinierte Toolfensterelementvorlage namens RDTExplorerWindow hinzu.

    Weitere Informationen zum Erstellen einer Erweiterung mit einem Toolfenster finden Sie unter Erstellen einer Erweiterung mit einem Toolfenster.

So abonnieren Sie RDT-Ereignisse

  1. Öffnen Sie die DATEI RDTExplorerWindowControl.xaml, und löschen Sie die Schaltfläche mit dem Namen button1. Fügen Sie ein ListBox Steuerelement hinzu, und akzeptieren Sie den Standardnamen. Das Grid-Element sollte wie folgt aussehen:

    <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. Öffnen Sie die DATEI RDTExplorerWindow.cs in der Codeansicht. Fügen Sie am Anfang der Datei die folgenden Using-Direktiven hinzu.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Ändern Sie die RDTExplorerWindow Klasse so, dass sie zusätzlich zur Ableitung von der ToolWindowPane Klasse die IVsRunningDocTableEvents Schnittstelle implementiert.

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. Implementieren Sie IVsRunningDocTableEvents.

    • Implementieren Sie die -Schnittstelle. Platzieren Sie den Cursor auf den Namen "IVsRunningDocTableEvents". Sie sollten eine Glühbirne am linken Rand sehen. Klicken Sie auf den Pfeil nach unten rechts neben der Glühbirne, und wählen Sie "Schnittstelle implementieren" aus.
  5. Ersetzen Sie in jeder Methode der Schnittstelle die Zeile throw new NotImplementedException(); durch Folgendes:

    return VSConstants.S_OK;
    
  6. Fügen Sie der RDTExplorerWindow-Klasse ein Cookiefeld hinzu.

    private uint rdtCookie;
    

    Dies enthält das Cookie, das von der AdviseRunningDocTableEvents Methode zurückgegeben wird.

  7. Überschreiben Sie die Initialize()-Methode von RDTExplorerWindow zum Registrieren für RDT-Ereignisse. Sie sollten immer Dienste in der Initialize()-Methode von ToolWindowPane abrufen, nicht im Konstruktor.

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

    Der SVsRunningDocumentTable Dienst wird aufgerufen, um eine IVsRunningDocumentTable Schnittstelle abzurufen. Die AdviseRunningDocTableEvents Methode verbindet RDT-Ereignisse mit einem Objekt, das in diesem Fall ein RDTExplorer-Objekt implementiert IVsRunningDocTableEvents.

  8. Aktualisieren Sie die Dispose()-Methode von RDTExplorerWindow.

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

    Die UnadviseRunningDocTableEvents Methode löscht die Verbindung zwischen RDTExplorer und RDT-Ereignisbenachrichtigung.

  9. Fügen Sie die folgende Zeile direkt vor der return Anweisung zum Textkörper des OnBeforeLastDocumentUnlock Handlers hinzu.

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Fügen Sie dem Textkörper des OnAfterFirstDocumentLock Handlers und anderen Ereignissen, die im Listenfeld angezeigt werden sollen, eine ähnliche Zeile hinzu.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Erstellen Sie das Projekt, und starten Sie das Debugging. Die experimentelle Visual Studio-Instanz wird angezeigt.

  12. Öffnen Sie rdTExplorerWindow(Ansicht / Andere Windows / RDTExplorerWindow).

    Das RDTExplorerWindow-Fenster wird mit einer leeren Ereignisliste geöffnet.

  13. Öffnen oder Erstellen einer Lösung.

    Sobald OnBeforeLastDocument ereignisse OnAfterFirstDocument ausgelöst werden, wird die Benachrichtigung jedes Ereignisses in der Ereignisliste angezeigt.