如何检查我的VS 2017扩展中的工具窗口是否隐藏

问题描述 投票:1回答:2

我正在为Visual Studio 2017开发一个包含自定义“工具窗口”的扩展。这个“工具窗口”包含WPF control,其中view model订阅了Workspace.WorkspaceChanged和EnvDTE.DTE.Events.WindowEvents.WindowActivated事件。

我知道当“工具窗口”被用户关闭时,它实际上并没有被破坏而是“隐藏”。但是,它仍然对我的事件作出反应。

所以,我想知道两个问题的答案:

  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;
}
c# visual-studio-2017 vsix visual-studio-sdk vssdk
2个回答
2
投票

要检测工具窗口何时关闭,您可以从IVsWindowFrameNotify3继承它,并在OnShow方法中检查fShow ==(int)__FRAMESHOW.FRAMESHOW_WinClosed


0
投票

只是为了添加@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;
}
© www.soinside.com 2019 - 2024. All rights reserved.