Как проверить, что окно инструментов в моем расширении VS 2017 для скрыто - PullRequest
1 голос
/ 01 апреля 2019

Я разрабатываю расширение для Visual Studio 2017, которое содержит пользовательское «окно инструментов».Это «окно инструментов» содержит WPF control с view model, подписанным на Workspace.WorkspaceChanged и EnvDTE.DTE.Events.WindowEvents.WindowActivation события.

IЗнайте, что когда «окно инструментов» закрыто пользователем, оно на самом деле не уничтожается, а «скрывается».Тем не менее, он все еще реагирует на мои события.

Итак, я хочу знать ответы на два вопроса:

  1. Как проверить, что окно инструмента скрыто?
  2. Можно ли "закрыть" окно инструмента, чтобы оно было разрушено?

РЕДАКТИРОВАТЬ: код для создания окна инструмента:

protected virtual TWindow OpenToolWindow()
{
        ThreadHelper.ThrowIfNotOnUIThread();

        // Get the instance number 0 of this tool window. This window is single instance so this instance
        // is actually the only one.
        // The last flag is set to true so that if the tool window does not exists it will be created.
        ToolWindowPane window = Package.FindToolWindow(typeof(TWindow), id: 0, create: true);

        if (window?.Frame == null)
        {
            throw new NotSupportedException("Cannot create tool window");
        }

        IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
        Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
        return window as TWindow;
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Чтобы определить, когда окно инструментов закрыто, вы можете унаследовать его от IVsWindowFrameNotify3 и в методе OnShow проверить fShow == (int) __ FRAMESHOW.FRAMESHOW_WinClosed .

0 голосов
/ 02 апреля 2019

Просто чтобы добавить к ответу @Sergey Vlasov - я нашел второй способ уведомления, если окно скрыто / показано.Вот код из моей модели представления управления WPF.

EnvDTE.DTE dte = MyVSPackage.Instance.GetService<EnvDTE.DTE>();

// _visibilityEvents is a private field. 
// There is a recommendation to store VS events objects in a field 
// to prevent them from being GCed
_visibilityEvents = (dte?.Events as EnvDTE80.Events2)?.WindowVisibilityEvents;

if (_visibilityEvents != null)
{
    _visibilityEvents.WindowShowing += VisibilityEvents_WindowShowing;
    _visibilityEvents.WindowHiding += VisibilityEvents_WindowHiding;
}
...