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
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
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>
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;
Zmodyfikuj klasę
RDTExplorerWindow
tak, aby oprócz wyprowadzania z ToolWindowPane klasy implementuje IVsRunningDocTableEvents interfejs.public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
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.
W każdej metodzie w interfejsie zastąp wiersz
throw new NotImplementedException();
następującym:return VSConstants.S_OK;
Dodaj pole pliku cookie do klasy RDTExplorerWindow.
private uint rdtCookie;
Spowoduje to, że plik cookie jest zwracany przez metodę AdviseRunningDocTableEvents .
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.
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.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; }
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; }
Skompiluj projekt i rozpocznij debugowanie. Zostanie wyświetlone wystąpienie eksperymentalne programu Visual Studio.
Otwórz okno RDTExplorerWindow (Widok / Inne windows / RDTExplorerWindow).
Okno RDTExplorerWindow zostanie otwarte z pustą listą zdarzeń.
Otwórz lub utwórz rozwiązanie.
Gdy
OnBeforeLastDocument
zdarzenia iOnAfterFirstDocument
zostaną wyzwolone, na liście zdarzeń zostanie wyświetlone powiadomienie o każdym zdarzeniu.