如何设置VSIX工具窗口首次打开的停靠位置并实现位置持久化
VSIX工具窗口:实现首次指定停靠位置+保留用户调整状态
你的问题在于每次打开窗口都强制设置了停靠模式,但未指定具体位置,还覆盖了VS自动保存的窗口状态。要实现需求,核心是仅在首次创建窗口时设置自定义停靠位置,后续打开时复用VS保存的用户调整状态。
修改思路
- 先尝试查找已存在的工具窗口,避免重复创建
- 仅在首次创建窗口时,设置停靠模式和具体位置
- 后续打开直接显示,依赖VS自动保存的窗口状态
修改后的代码
// 先尝试查找已存在的窗口(不创建新实例) ToolWindowPane window = this.package.FindToolWindow(typeof(ToolWindow1), 0, false); if (window == null) { // 首次创建窗口 window = this.package.FindToolWindow(typeof(ToolWindow1), 0, true); if ((null == window) || (null == window.Frame)) { throw new NotSupportedException("无法创建工具窗口"); } IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame; // 设置窗口为停靠模式 Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure( windowFrame.SetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, (int)VSFRAMEMODE.VSFM_Dock)); // 指定首次停靠位置:示例为停靠到右侧 Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure( windowFrame.SetFramePos( VSSETFRAMEPOS.SFP_fDockRight, // 可选值:SFP_fDockLeft/SFP_fDockTop/SFP_fDockBottom Guid.Empty, // 若要停靠到特定窗口(如解决方案资源管理器),可传入对应Guid(如VSConstants.StandardToolWindows.SolutionExplorer) 0, 0, 0, 0, // 停靠模式下坐标/大小可设为0 0)); } // 显示窗口(首次创建后,后续打开会自动加载用户调整的位置) IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame; Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
代码放置位置
代码通常放在两个地方:
- Package类的Initialize方法:如果窗口是随VS启动自动打开的
- 命令回调方法:如果窗口是通过菜单/快捷键触发打开的
关键说明
- 不要每次打开窗口都设置停靠属性,否则会覆盖用户调整后的位置
- VS会自动保存工具窗口的位置状态,只要不强制覆盖,后续打开会复用用户最后调整的位置
SetFramePos的第二个参数可以指定停靠目标窗口,比如传入VSConstants.StandardToolWindows.SolutionExplorer就能把窗口停靠到解决方案资源管理器旁边
内容的提问来源于stack exchange,提问作者Joan Joy
相关产品推荐
相关产品推荐

