Подписка на событие
В этом пошаговом руководстве объясняется, как создать окно инструментов, которое отвечает на события в работающей таблице документов (RDT). В окне инструментов размещается IVsRunningDocTableEventsпользовательский элемент управления, реализующий . Метод AdviseRunningDocTableEvents подключает интерфейс к событиям.
Подписка на события RDT
Создание расширения с помощью окна инструментов
Создайте проект с именем RDT Обозреватель с помощью шаблона VSIX и добавьте пользовательский шаблон элемента окна инструментов с именем RDT Обозреватель Window.
Дополнительные сведения о создании расширения с помощью окна инструментов см. в разделе "Создание расширения с помощью окна инструментов".
Подписка на события RDT
Откройте файл RDT Обозреватель WindowControl.xaml и удалите кнопку с именем
button1
. Добавьте элемент управления и примите ListBox имя по умолчанию. Элемент Grid должен выглядеть следующим образом:<Grid> <StackPanel Orientation="Vertical" Margin="-10,10,10,0"> <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock> <ListBox x:Name="listBox" Height="100" /> </StackPanel> </Grid>
Откройте файл RDT Обозреватель Window.cs в представлении кода. Добавьте следующие директивы using в начало файла.
using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop;
Измените
RDTExplorerWindow
класс таким образом, чтобы в дополнение к производным от ToolWindowPane класса он реализует IVsRunningDocTableEvents интерфейс.public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
Реализуйте расширение IVsRunningDocTableEvents.
- Реализуйте интерфейс . Поместите курсор на имя IVsRunningDocTableEvents. Вы должны увидеть лампочку в левом поле. Щелкните стрелку ВНИЗ справа от лампочки и выберите "Реализовать интерфейс".
В каждом методе в интерфейсе замените строку
throw new NotImplementedException();
следующим образом:return VSConstants.S_OK;
Добавьте поле cookie в класс RDT Обозреватель Window.
private uint rdtCookie;
Он содержит файл cookie, возвращаемый методом AdviseRunningDocTableEvents .
Переопределите метод RDT Обозреватель Window Initialize() для регистрации для событий RDT. Службы всегда следует получать в методе Initialize() ToolWindowPane, а не в конструкторе.
protected override void Initialize() { IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) this.GetService(typeof(SVsRunningDocumentTable)); rdt.AdviseRunningDocTableEvents(this, out rdtCookie); }
Служба SVsRunningDocumentTable вызывается для получения IVsRunningDocumentTable интерфейса. Метод AdviseRunningDocTableEvents подключает события RDT к объекту, реализующего IVsRunningDocTableEventsобъект, в данном случае объект RDT Обозреватель.
Обновите метод RDT Обозреватель Window в Dispose().
protected override void Dispose(bool disposing) { // Release the RDT cookie. IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) Package.GetGlobalService(typeof(SVsRunningDocumentTable)); rdt.UnadviseRunningDocTableEvents(rdtCookie); base.Dispose(disposing); }
Метод UnadviseRunningDocTableEvents удаляет подключение между
RDTExplorer
и уведомлением о событии RDT.Добавьте следующую строку в текст обработчика OnBeforeLastDocumentUnlock непосредственно перед оператором
return
.public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock"); return VSConstants.S_OK; }
Добавьте аналогичную строку в текст обработчика OnAfterFirstDocumentLock и другие события, которые вы хотите увидеть в списке.
public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock"); return VSConstants.S_OK; }
Выполните сборку решения и запустите отладку. Появится экспериментальный экземпляр Visual Studio.
Откройте RDT Обозреватель Window (вид / другие окна / RDT Обозреватель Window).
Откроется окно RDT Обозреватель Window с пустым списком событий.
Откройте или создайте решение.
Как
OnBeforeLastDocument
иOnAfterFirstDocument
события запускаются, уведомление о каждом событии отображается в списке событий.