上一篇已经讲了如何创建树视图,但如果你不想在原来的默认侧边栏面板上做修改,而是想自己定义一个侧边栏,因为你的内容可能不属于这些面板上相关的内容,比如包管理视图。下面就来详细讨论如何实现这个目标。
package.json
配置
首先,还是从 package.json 配置开始。首先,你需要定义一个在活动栏上的视图容器,然后再定义视图列表。如下所示:
{
"contributes": {
"viewsContainers": {
"activitybar": [
{
"id": "package-explorer",
"title": "Package Explorer",
"icon": "resources/package-explorer.svg"
}
]
},
"views": {
"package-explorer": [
{
"id": "package-dependencies",
"name": "Dependencies"
},
{
"id": "package-outline",
"name": "Outline"
}
]
}
}
}
在上面的配置中,我们在活动栏(activitybar
)上添加了一个图标、标题和 id。视图列表(views
)的定义方式你应该在上一篇文章中了解了,这里定义了视图的 id 和名称,其中package-explore
与活动栏的 id 完全一致。配置完成后,效果如下:
当然,你还需要在视图面板中添加内容,这与前一篇文章中定义树视图的方法完全相同。
webview 视图
package.json
类型配置
在定义树视图后,你可能会发现树视图的功能有一些限制,无法用于创建复杂的页面。因此,你可能会考虑使用 Webview 视图,这也是完全可行的。首先,你需要在package.json
中声明视图类型,如下所示:
"package-explorer": [
{
"type": "webview",
"id": "package-dependencies",
"name": "Dependencies"
},
{
"id": "package-outline",
"name": "Outline"
}
]
在上面的配置中,我在第一个视图(Dependencies
)中添加了"type": "webview"
,这样就可以在代码中使用 Webview 视图了。
视图提供器
与之前一样,你需要编写一个视图提供器类。基本结构如下:
import * as vscode from 'vscode'
class DependenciesProvider implements vscode.WebviewViewProvider {
context: vscode.ExtensionContext
constructor(context: vscode.ExtensionContext) {
this.context = context
}
// 实现 resolveWebviewView 方法,用于处理 WebviewView 的创建和设置
resolveWebviewView(webviewView: vscode.WebviewView, context: vscode.WebviewViewResolveContext<unknown>, token: vscode.CancellationToken): void | Thenable<void> {
// 配置 WebviewView 的选项
webviewView.webview.options = {
enableScripts: true,
localResourceRoots: [this.context.extensionUri]
};
// 设置 WebviewView 的 HTML 内容,可以在这里指定要加载的网页内容
webviewView.webview.html = "HTML 内容"
}
}
同样,你还需要注册这个类:
vscode.window.registerWebviewViewProvider('package-dependencies', new DependenciesProvider(context))
// 或者
vscode.window.createTreeView('package-dependencies', {
treeDataProvider: new DependenciesProvider(context),
})
这样,当你点击活动栏图标时,就可以看到自定义侧边栏的界面了。
更多功能
操作按钮
为了提供更丰富的用户交互体验,通常需要在视图中添加各种操作(Actions),例如刷新、添加、编辑、删除等。这些操作可以通过菜单和视图标题栏等位置提供给用户。
我们可以看到图片上有 4 个位置的操作按钮。
1. 添加和刷新按钮
添加和刷新按钮位于标题栏上,需要使用 view/title 位置声明按钮。刷新按钮不需要点击“…”区域展开菜单,而“Add”按钮需要。以下是配置示例:
"contributes": {
"commands": [
{
"command": "package-outline.refreshEntry",
"title": "Refresh",
"icon": {
"light": "resources/light/refresh.svg",
"dark": "resources/dark/refresh.svg"
}
},
{
"command": "package-outline.addEntry",
"title": "Add"
}
],
"menus": {
"view/title": [
{
"command": "package-outline.refreshEntry",
"when": "view == package-outline",
"group": "navigation"
},
{
"command": "package-outline.addEntry",
"when": "view == package-outline"
}
]
}
}
可以看到,两者的不同之处在于刷新按钮添加了"group": "navigation"
。而"when": "view == package-outline"
用于定义哪个视图应用这些操作,这里表示 Outline 视图。
2. 删除和编辑按钮
删除和编辑按钮针对单个项,需要在view/item/context
下定义。其中,删除按钮是右键菜单中的选项,而编辑图标仅在鼠标悬停在该项上时显示。以下是它们的配置示例:
"contributes": {
"commands": [
{
"command": "package-outline.editEntry",
"title": "Edit",
"icon": {
"light": "resources/light/edit.svg",
"dark": "resources/dark/edit.svg"
}
},
{
"command": "package-outline.deleteEntry",
"title": "Delete"
}
],
"menus": {
"view/item/context": [
{
"command": "package-outline.editEntry",
"when": "view == package-outline",
"group": "inline"
},
{
"command": "package-outline.deleteEntry",
"when": "view == package-outline"
}
]
}
}
这两者之间的不同之处同样在于group
的不同。group
中的navigation
和inline
是默认的,你也可以随意命名,随意命名的话会出现在“Add”或“Delete”按钮的位置,并且不同的group
会进行分组显示。如同下图所示:
默认情况下,按钮会按字母顺序排列。如果你想按自己的顺序排列,可以在group
名称的末尾添加@[数字]
。
欢迎内容
这个应该很常见,例如,在新建一个 VSCode 窗口并且还没有打开任何项目时,项目视图会显示文本提示和添加按钮。这个配置可以在viewsWelcome
内进行配置,内容(contents
)可以使用 Markdown 格式编写。
"contributes": {
"viewsWelcome": [
{
"view": "package-outline",
"contents": "No node packages found [learn more](https://www.npmjs.com/).\n[Add Packages](command:package-outline.addEntry)"
}
]
}
通过上述文章,你应该已经更深入地了解了如何自定义侧边栏视图。