You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置VSIX工具窗口首次打开的停靠位置并实现位置持久化

VSIX工具窗口:实现首次指定停靠位置+保留用户调整状态

你的问题在于每次打开窗口都强制设置了停靠模式,但未指定具体位置,还覆盖了VS自动保存的窗口状态。要实现需求,核心是仅在首次创建窗口时设置自定义停靠位置,后续打开时复用VS保存的用户调整状态。

修改思路

  1. 先尝试查找已存在的工具窗口,避免重复创建
  2. 仅在首次创建窗口时,设置停靠模式和具体位置
  3. 后续打开直接显示,依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:08:41