Přihlášení k odběru události
Tento názorný postup vysvětluje, jak vytvořit okno nástroje, které reaguje na události ve spuštěné tabulce dokumentů (RDT). Okno nástroje je hostitelem uživatelského ovládacího prvku, který implementuje IVsRunningDocTableEvents. Metoda AdviseRunningDocTableEvents připojí rozhraní k událostem.
Přihlášení k odběru událostí RDT
Vytvoření rozšíření s oknem nástroje
Vytvořte projekt s názvem RDTExplorer pomocí šablony VSIX a přidejte vlastní šablonu okna nástrojů s názvem RDTExplorerWindow.
Další informace o vytvoření rozšíření pomocí okna nástroje naleznete v tématu Vytvoření rozšíření pomocí okna nástrojů.
Přihlášení k odběru událostí RDT
Otevřete soubor RDTExplorerWindowControl.xaml a odstraňte tlačítko s názvem
button1
. ListBox Přidejte ovládací prvek a přijměte výchozí název. Element Grid by měl vypadat takto:<Grid> <StackPanel Orientation="Vertical" Margin="-10,10,10,0"> <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock> <ListBox x:Name="listBox" Height="100" /> </StackPanel> </Grid>
Otevřete soubor RDTExplorerWindow.cs v zobrazení kódu. Na začátek souboru přidejte následující direktivy using.
using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop;
RDTExplorerWindow
Upravte třídu tak, aby kromě odvození z ToolWindowPane třídy implementuje IVsRunningDocTableEvents rozhraní.public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
Implementovat IVsRunningDocTableEvents.
- Implementujte rozhraní . Umístěte kurzor na název IVsRunningDocTableEvents. Měla by se zobrazit žárovka na levém okraji. Klikněte na šipku dolů napravo od žárovky a vyberte Implementovat rozhraní.
V každé metodě v rozhraní nahraďte řádek
throw new NotImplementedException();
tímto:return VSConstants.S_OK;
Přidejte pole cookie do třídy RDTExplorerWindow.
private uint rdtCookie;
To obsahuje soubor cookie vrácený metodou AdviseRunningDocTableEvents .
Přepište metodu RDTExplorerWindow Initialize() pro registraci událostí RDT. Vždy byste měli získat služby v ToolWindowPane Initialize() metoda, ne v konstruktoru.
protected override void Initialize() { IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) this.GetService(typeof(SVsRunningDocumentTable)); rdt.AdviseRunningDocTableEvents(this, out rdtCookie); }
Služba SVsRunningDocumentTable je volána k získání IVsRunningDocumentTable rozhraní. AdviseRunningDocTableEvents Metoda připojí události RDT k objektu, který implementuje IVsRunningDocTableEvents, v tomto případě RDTExplorer objektu.
Aktualizujte metodu RDTExplorerWindow 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 odstraní připojení mezi
RDTExplorer
událostí RDT a oznámením o události RDT.Do textu OnBeforeLastDocumentUnlock obslužné rutiny přidejte následující řádek těsně před
return
příkaz.public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock"); return VSConstants.S_OK; }
Přidejte podobný řádek k textu OnAfterFirstDocumentLock obslužné rutiny a k dalším událostem, které chcete zobrazit v seznamu.
public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock"); return VSConstants.S_OK; }
Sestavte projekt a spusťte ladění. Zobrazí se experimentální instance sady Visual Studio.
Otevřete RDTExplorerWindow (zobrazení / jiná okna / RDTExplorerWindow).
Otevře se okno RDTExplorerWindow s prázdným seznamem událostí.
Otevřete nebo vytvořte řešení.
OnAfterFirstDocument
PřiOnBeforeLastDocument
vyvolání událostí se v seznamu událostí zobrazí oznámení o každé události.