Visual Studio 2017: вызов события, когда пользователь меняет вкладку

Я пытаюсь написать планировщик для XML-кода в VS (расширение, использующее их SDK из шаблона VSIX), и я хотел бы получать вызов события всякий раз, когда пользователь переходит на другой код/документ.

Затем я планирую проверить тип документа, создать и отобразить интерактивную схему, если это действительно XML-документ.

Как мне создать такой хук и нужен ли он вообще?

ИЗМЕНИТЬ

Я попытался реализовать следующую реализацию, но мне сказали, что объект не содержит определения для «GetGlobalService».

using System;
using System.Runtime.InteropServices;
using EnvDTE;
using Microsoft.VisualStudio.Shell;

[Guid("bc4c5e8f-a492-4a44-9e57-ec9ad945140e")]
public class OutlineWindow : ToolWindowPane
{

    private DTE dte;

    public OutlineWindow() : base(null)
    {
        this.Caption = "OutlineWindow";

        this.Content = new OutlineWindowControl();

        dte = Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
        dte.Events.WindowEvents.WindowActivated += OnWindowActivated;
    }

    private void OnWindowActivated(Window gotFocus, Window lostFocus)
    {
        throw new NotImplementedException();
    }
}

person TheLogan    schedule 22.01.2018    source источник
comment
Внутренняя структура VS сильно меняется, это может быть недействительным, но см. visual-studio">Событие, когда окно документа находится в фокусе в Visual Studio   -  person stuartd    schedule 22.01.2018
comment
Похоже, это могло бы сработать, но мне говорят, что «объект» не содержит определения для «Package.GetGlobalService» и т. д. Это то, с чем я столкнулся, используя множество способов, которые я пытался сделать это раньше.   -  person TheLogan    schedule 22.01.2018
comment
Возможно, вам не хватает актерского состава. Можете ли вы отредактировать свой вопрос с соответствующим кодом?   -  person stuartd    schedule 22.01.2018
comment
Я только что создал новый пустой класс с тем же кодом (я буквально скопировал его из класса, который жаловался), и он не дает ошибок, и из этого я обнаружил, что проблема была в наследовании от ToolWindowPane.. doh Благодарю вас! :)   -  person TheLogan    schedule 22.01.2018


Ответы (1)


Благодаря @stuartd мне удалось заставить это работать! На самом деле моя проблема заключалась в том, что я поместил его не в тот класс, наследование все испортило.

public class OutlineManager
{
    private DTE dte;

    public OutlineManager()
    {
        dte = Package.GetGlobalService(typeof(DTE)) as DTE;
        dte.Events.WindowEvents.WindowActivated += OnWindowActivated;
    }

    private void OnWindowActivated(Window gotFocus, Window lostFocus)
    {
        //This is run when a new "window"(panel) gains focus (not only the code window though)
    }
}
person TheLogan    schedule 23.01.2018