树视图
本节将教你如何为VS Code添加视图容器和树视图的插件,示例插件的源代码请查看https://github.com/Microsoft/vscode-extension-samples/tree/master/tree-view-sample。
视图容器
视图容器包含了一列视图(views),这些视图又包含在内置的视图容器中。

要想配置一个视图容器,你首先得注册package.json中的contributes.viewsContainers。你还必须配置以下字段:
id: 新视图容器的名称title: 展示给用户的视图容器名称,它会显示在视图容器上方icon: 在活动栏中展示的图标
"contributes": {"viewsContainers": {"activitybar": [{"id": "package-explorer","title": "Package Explorer","icon": "media/dep.svg"}]}}
树视图
视图是显示在视图容器中的UI片段。使用contributes.views进行配置,你就可以将新的视图添加到内置或者你配置好的视图容器中了。

要想配置一个视图,你首先得注册package.json中的contributes.views。你必须给视图配置一个ID外加一个名称,你还可以配置视图出现的位置:
explorer: 显示在资源管理器侧边栏debug: 显示在调试侧边栏scm: 显示在源代码侧边栏test: 测试侧边栏中的资源管理器视图- 显示在你定义好的视图容器中
"contributes": {"views": {"package-explorer": [{"id": "nodeDependencies","name": "Node Dependencies","when": "explorer"}]}}
当用户打开了对应的视图,VS Code会触发onView:${viewId}事件(如上面例子中,这个事件写为onView:nodeDependencies)。你也可以通过配置when字段控制视图的展示。
视图的操作
你可以配置视图下述位置的操作:
view/title: 视图标题位置显示的操作。这里可以配置主要的操作,使用"group": "navigation"进行配置,剩余的二级操作则出现在...菜单中。view/item/context: 每个视图项的操作。这里可以配置主要的操作,使用"group": "inline",剩余的二级操作则出现在...菜单中。
使用when属性控制这些操作的展示。

例如:
"contributes": {"commands": [{"command": "nodeDependencies.refreshEntry","title": "Refresh","icon": {"light": "resources/light/refresh.svg","dark": "resources/dark/refresh.svg"}},{"command": "nodeDependencies.addEntry","title": "Add"},{"command": "nodeDependencies.editEntry","title": "Edit","icon": {"light": "resources/light/edit.svg","dark": "resources/dark/edit.svg"}},{"command": "nodeDependencies.deleteEntry","title": "Delete"}],"menus": {"view/title": [{"command": "nodeDependencies.refreshEntry","when": "view == nodeDependencies","group": "navigation"},{"command": "nodeDependencies.addEntry","when": "view == nodeDependencies"}],"view/item/context": [{"command": "nodeDependencies.editEntry","when": "view == nodeDependencies && viewItem == dependency","group": "inline"},{"command": "nodeDependencies.deleteEntry","when": "view == nodeDependencies && viewItem == dependency"}]}}
!> 注意:如果你需要针对特定的条目显示特殊的操作,定义树视图项的TreeItem.contextValue,并且在when中使用表达式,视图项的值储存在表达式的viewItem中。
如:
"contributes": {"menus": {"view/item/context": [{"command": "nodeDependencies.deleteEntry","when": "view == nodeDependencies && viewItem == dependency"}]}}
为树视图提供数据
插件创作者需要注册TreeDataProvider,以便动态生成视图中的数据。
vscode.window.registerTreeDataProvider('nodeDependencies', new DepNodeProvider());
更多实现请参考nodeDependencies.ts
动态创建树视图
如果你想在视图中通过编程手段创建一些操作,你就不能再注册window.registerTreeDataProvider了,而是window.createTreeView,这样一来你就有权限提供你喜欢的视图操作了:
vscode.window.createTreeView('ftpExplorer', {treeDataProvider: new FtpTreeDataProvider()});
更多实现请参考ftpExplorer.ts
