Udostępnij za pośrednictwem


Subskrybowanie zdarzenia

W tym przewodniku wyjaśniono, jak utworzyć okno narzędzia, które reaguje na zdarzenia w uruchomionej tabeli dokumentów (RDT). Okno narzędzia hostuje kontrolkę użytkownika, która implementuje IVsRunningDocTableEventselement . Metoda AdviseRunningDocTableEvents łączy interfejs ze zdarzeniami.

Subskrybowanie zdarzeń RDT

Aby utworzyć rozszerzenie za pomocą okna narzędzi

  1. Utwórz projekt o nazwie RDTExplorer przy użyciu szablonu VSIX i dodaj niestandardowy szablon elementu okna narzędzi o nazwie RDTExplorerWindow.

    Aby uzyskać więcej informacji na temat tworzenia rozszerzenia za pomocą okna narzędzi, zobacz Tworzenie rozszerzenia za pomocą okna narzędzi.

Aby subskrybować zdarzenia RDT

  1. Otwórz plik RDTExplorerWindowControl.xaml i usuń przycisk o nazwie button1. Dodaj kontrolkę ListBox i zaakceptuj nazwę domyślną. Element Grid powinien wyglądać następująco:

    <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. Otwórz plik RDTExplorerWindow.cs w widoku kodu. Dodaj następujące dyrektywy using na początku pliku.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Zmodyfikuj klasę RDTExplorerWindow tak, aby oprócz wyprowadzania z ToolWindowPane klasy implementuje IVsRunningDocTableEvents interfejs.

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

    • Zaimplementuj interfejs . Umieść kursor na nazwie IVsRunningDocTableEvents. Powinna zostać wyświetlona żarówka na lewym marginesie. Kliknij strzałkę w dół po prawej stronie żarówki i wybierz pozycję Zaimplementuj interfejs.
  5. W każdej metodzie w interfejsie zastąp wiersz throw new NotImplementedException(); następującym:

    return VSConstants.S_OK;
    
  6. Dodaj pole pliku cookie do klasy RDTExplorerWindow.

    private uint rdtCookie;
    

    Spowoduje to, że plik cookie jest zwracany przez metodę AdviseRunningDocTableEvents .

  7. Zastąp metodę Initialize() RDTExplorerWindow w celu zarejestrowania się na potrzeby zdarzeń RDT. Zawsze należy pobierać usługi w metodzie Initialize() toolWindowPane, a nie w konstruktorze.

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

    Usługa SVsRunningDocumentTable jest wywoływana w celu uzyskania interfejsu IVsRunningDocumentTable . Metoda AdviseRunningDocTableEvents łączy zdarzenia RDT z obiektem, który implementuje IVsRunningDocTableEventsobiekt , w tym przypadku obiekt RDTExplorer.

  8. Zaktualizuj metodę RDTExplorerWindow's Dispose().

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

    Metoda UnadviseRunningDocTableEvents usuwa połączenie między RDTExplorer powiadomieniem o zdarzeniu RDT.

  9. Dodaj następujący wiersz do treści OnBeforeLastDocumentUnlock procedury obsługi tuż przed instrukcją 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. Dodaj podobny wiersz do treści OnAfterFirstDocumentLock programu obsługi i do innych zdarzeń, które chcesz zobaczyć w polu listy.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Skompiluj projekt i rozpocznij debugowanie. Zostanie wyświetlone wystąpienie eksperymentalne programu Visual Studio.

  12. Otwórz okno RDTExplorerWindow (Widok / Inne windows / RDTExplorerWindow).

    Okno RDTExplorerWindow zostanie otwarte z pustą listą zdarzeń.

  13. Otwórz lub utwórz rozwiązanie.

    Gdy OnBeforeLastDocument zdarzenia i OnAfterFirstDocument zostaną wyzwolone, na liście zdarzeń zostanie wyświetlone powiadomienie o każdym zdarzeniu.