Поделиться через


Подписка на событие

В этом пошаговом руководстве объясняется, как создать окно инструментов, которое отвечает на события в работающей таблице документов (RDT). В окне инструментов размещается IVsRunningDocTableEventsпользовательский элемент управления, реализующий . Метод AdviseRunningDocTableEvents подключает интерфейс к событиям.

Подписка на события RDT

Создание расширения с помощью окна инструментов

  1. Создайте проект с именем RDT Обозреватель с помощью шаблона VSIX и добавьте пользовательский шаблон элемента окна инструментов с именем RDT Обозреватель Window.

    Дополнительные сведения о создании расширения с помощью окна инструментов см. в разделе "Создание расширения с помощью окна инструментов".

Подписка на события RDT

  1. Откройте файл 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>
    
  2. Откройте файл RDT Обозреватель Window.cs в представлении кода. Добавьте следующие директивы using в начало файла.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Измените RDTExplorerWindow класс таким образом, чтобы в дополнение к производным от ToolWindowPane класса он реализует IVsRunningDocTableEvents интерфейс.

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. Реализуйте расширение IVsRunningDocTableEvents.

    • Реализуйте интерфейс . Поместите курсор на имя IVsRunningDocTableEvents. Вы должны увидеть лампочку в левом поле. Щелкните стрелку ВНИЗ справа от лампочки и выберите "Реализовать интерфейс".
  5. В каждом методе в интерфейсе замените строку throw new NotImplementedException(); следующим образом:

    return VSConstants.S_OK;
    
  6. Добавьте поле cookie в класс RDT Обозреватель Window.

    private uint rdtCookie;
    

    Он содержит файл cookie, возвращаемый методом AdviseRunningDocTableEvents .

  7. Переопределите метод 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 Обозреватель.

  8. Обновите метод 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.

  9. Добавьте следующую строку в текст обработчика 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;
    }
    
  10. Добавьте аналогичную строку в текст обработчика OnAfterFirstDocumentLock и другие события, которые вы хотите увидеть в списке.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Выполните сборку решения и запустите отладку. Появится экспериментальный экземпляр Visual Studio.

  12. Откройте RDT Обозреватель Window (вид / другие окна / RDT Обозреватель Window).

    Откроется окно RDT Обозреватель Window с пустым списком событий.

  13. Откройте или создайте решение.

    Как OnBeforeLastDocument и OnAfterFirstDocument события запускаются, уведомление о каждом событии отображается в списке событий.