猿问

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

我正在为 Visual Studio 2017 开发一个扩展,其中包含自定义“toolwindow”。此“工具窗口”包含WPF control订阅view modelWorkspace.WorkspaceChangedEnvDTE.DTE.Events.WindowEvents.WindowActivated事件。

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

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

  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;

}


白猪掌柜的
浏览 77回答 2
2回答

富国沪深

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

函数式编程

只是为了添加到@Sergey Vlasov 的回答 - 我发现了第二种方法,如果窗口被隐藏/显示,则会收到通知。这是我的 WPF 控件视图模型中的代码。EnvDTE.DTE dte = MyVSPackage.Instance.GetService<EnvDTE.DTE>();// _visibilityEvents is a private field.&nbsp;// There is a recommendation to store VS events objects in a field&nbsp;// to prevent them from being GCed_visibilityEvents = (dte?.Events as EnvDTE80.Events2)?.WindowVisibilityEvents;if (_visibilityEvents != null){&nbsp; &nbsp; _visibilityEvents.WindowShowing += VisibilityEvents_WindowShowing;&nbsp; &nbsp; _visibilityEvents.WindowHiding += VisibilityEvents_WindowHiding;}
随时随地看视频慕课网APP
我要回答