VS扩展开发:如何将ToolWindow搜索文本框置于工具栏下方?
ToolWindow搜索栏与工具栏布局问题解决方案
一、将搜索栏置于工具栏下方的实现方案
Visual Studio ToolWindowPane默认会把内置搜索框与通过VSCT添加的工具栏排列在同一行。要实现类似解决方案资源管理器的上下布局,需放弃默认的内置搜索集成逻辑,改为自定义ToolWindow的整体布局结构:
完全自主控制布局容器
放弃ToolWindowPane内置的搜索功能,在自定义用户控件(CpcObjectsWindowControl)的外层构建布局容器,先放置工具栏,再放置搜索框,最后承载原内容控件。这种方式需要手动实现搜索逻辑(文本监听、结果过滤等),替代原重写的内置搜索方法。基于WPF的自定义布局示例
若使用WPF控件,可通过重写Initialize方法构建分层布局:protected override void Initialize() { base.Initialize(); // 创建网格布局容器,分为三行:工具栏、搜索框、内容区 var layoutGrid = new Grid(); layoutGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); layoutGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); layoutGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); // 添加工具栏 var toolbarHost = (IVsToolWindowToolbarHost)GetService(typeof(IVsToolWindowToolbarHost)); if (toolbarHost != null) { var toolbarContainer = new FrameworkElement(); toolbarHost.AddToolbar(VSTWT_LOCATION.VSTWT_TOP, new Guid(CpcExtensionPackage.guidCpcExtensionPackageCmdSet), CpcExtensionPackage.cpcObjectsToolbar); Grid.SetRow(toolbarContainer, 0); layoutGrid.Children.Add(toolbarContainer); } // 添加自定义搜索框 var searchTextBox = new TextBox { PlaceholderText = "搜索CPC对象..." }; searchTextBox.TextChanged += (sender, e) => { // 在此实现搜索逻辑,比如过滤CpcObjectsWindowControl中的内容 }; Grid.SetRow(searchTextBox, 1); layoutGrid.Children.Add(searchTextBox); // 添加原内容控件 var contentControl = new CpcObjectsWindowControl(); Grid.SetRow(contentControl, 2); layoutGrid.Children.Add(contentControl); this.Content = layoutGrid; }
二、缩小工具栏占用空间的应急方案
若不想重构布局,可通过以下方式压缩工具栏的空间占用:
优化VSCT配置
在工具栏定义中添加DynamicVisibility和NoCustomize标记,同时确保命令按钮使用小尺寸图标:<Toolbar guid="guidCpcExtensionPackageCmdSet" id="cpcObjectsToolbar" priority="0x0000" type="ToolWindowToolbar"> <CommandFlag>DynamicVisibility</CommandFlag> <CommandFlag>NoCustomize</CommandFlag> <Strings> <ButtonText>CPC Objects Toolbar</ButtonText> </Strings> </Toolbar>调整工具栏宿主属性
在ToolWindowPane构造函数中,通过工具栏宿主设置紧凑显示:public CpcObjectsWindow() : base(null) { this.Caption = "CPC Objects"; this.Content = new CpcObjectsWindowControl(); this.ToolBar = new CommandID(new Guid(CpcExtensionPackage.guidCpcExtensionPackageCmdSet), CpcExtensionPackage.cpcObjectsToolbar); this.ToolBarLocation = (int)VSTWT_LOCATION.VSTWT_TOP; // 获取工具栏宿主并设置紧凑布局 var toolbarHost = (IVsToolWindowToolbarHost)GetService(typeof(IVsToolWindowToolbarHost)); toolbarHost?.SetToolbarVisibility((uint)VSTWT_LOCATION.VSTWT_TOP, true); }清理冗余命令组
删除VSCT中未使用的命令组定义,避免空白区域撑开工具栏,仅保留实际需要的命令按钮。
内容的提问来源于stack exchange,提问作者Vasco Ferreira
相关产品推荐
相关产品推荐

