上一篇: 创建扩展。 我们将从本文中创建的项目开始。
创建扩展后,可以向其添加一些命令。
添加一些命令
我们可以先导航到 <ExtensionName>Page.cs
文件。 用户选择您的扩展时,将显示的文件为 ListPage。 此时应会看到:
public <ExtensionName>Page()
{
Icon = IconHelpers.FromRelativePath("Assets\\StoreLogo.png");
Title = "My sample extension";
Name = "Open";
}
public override IListItem[] GetItems()
{
return [
new ListItem(new NoOpCommand()) { Title = "TODO: Implement your extension here" }
];
}
在这里,你可以看到我们已经为页面设置了图标、标题及在顶部显示的名称,这些是在你选择命令后会显示的内容。 GetItems 方法将返回想要在此页上显示的命令列表。 现在,它只返回一个不执行任何操作的命令。 让我们尝试使用该命令在用户的默认 Web 浏览器中打开 此 页面。
我们可以将 GetItems 的实现更改为以下内容:
public override IListItem[] GetItems()
{
var command = new OpenUrlCommand("https://learn.microsoft.com/windows/powertoys/command-palette/adding-commands");
return [
new ListItem(command)
{
Title = "Open the Command Palette documentation",
}
];
}
重新部署应用程序,运行“重新加载”命令以刷新扩展面板中的扩展,然后前往您的扩展。 此时应会看到该命令将打开命令面板文档。
OpenUrlCommand 是一个帮助程序,用于在用户的默认 Web 浏览器中打开 URL。 您可以根据自己的需求来实现扩展。 让我们创建一个新命令,其中显示了 MessageBox。 为此,我们需要创建实现 IInvokableCommand 的新类。
using System.Runtime.InteropServices;
namespace <ExtensionName>;
internal sealed partial class ShowMessageCommand : InvokableCommand
{
public override string Name => "Show message";
public override IconInfo Icon => new("\uE8A7");
public override CommandResult Invoke()
{
// 0x00001000 is MB_SYSTEMMODAL, which will display the message box on top of other windows.
_ = MessageBox(0, "I came from the Command Palette", "What's up?", 0x00001000);
return CommandResult.KeepOpen();
}
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
}
现在,我们可以将此命令添加到文件中的 <ExtensionName>Page.cs
命令列表中:
public override IListItem[] GetItems()
{
var command = new OpenUrlCommand("https://learn.microsoft.com/windows/powertoys/command-palette/creating-an-extension");
var showMessageCommand = new ShowMessageCommand();
return [
new ListItem(command)
{
Title = "Open the Command Palette documentation",
},
new ListItem(showMessageCommand),
];
}
部署并重新加载,然后 - 显示消息框的命令就出现了!
小窍门
此时,你可能希望为项目初始化所选的 git 存储库/{其他源代码管理方法} 。 这样,可以更轻松地跟踪更改,并与其他人共享扩展。
我们建议使用 GitHub,因为可以轻松地与他人协作处理扩展,并获取反馈,并将其与世界共享。
添加更多页面
到目前为止,我们只使用“执行某些操作”的命令。 但是,还可以添加命令,用于在命令面板中显示其他页面。 调色板中基本上有两种“命令”:
- IInvokableCommand - 这些命令可以执行某些操作。
- IPage - 这些命令 显示某些内容。
由于 IPage 的实现是 ICommand,因此可以在任何可以使用命令的地方使用它们。 这意味着你可以将它们添加到命令的顶级列表,或添加到页面上的命令列表、项上的上下文菜单等。
可以显示两种不同类型的页面:
- ListPage - 这是一个显示命令列表的页面。 这就是我们到目前为止一直在处理的事情。
- ContentPage - 这是向用户显示丰富内容的页面。 这样可以让你指定抽象内容,并让命令面板负责在本地环境中呈现内容。 目前支持两种不同类型的内容:
- Markdown 内容 - 这是用 Markdown 编写的内容,并在命令面板中呈现。 有关详细信息,请参阅 MarkdownContent 。
- 表单内容 - 这是向用户显示窗体的内容,然后将该窗体的结果返回到扩展。 这些由 自适应卡片 提供支持,这对于获取用户输入或显示更复杂的信息布局非常有用。 有关详细信息,请参阅 FormContent 。
首先添加显示命令列表的新页面。 创建实现 ListPage 的新类:
using Microsoft.CommandPalette.Extensions.Toolkit;
using System.Linq;
namespace <ExtensionName>;
internal sealed partial class MySecondPage : ListPage
{
public MySecondPage()
{
Icon = new("\uF147"); // Dial2
Title = "My second page";
Name = "Open";
}
public override IListItem[] GetItems()
{
// Return 100 CopyText commands
return Enumerable
.Range(0, 100)
.Select(i => new ListItem(new CopyTextCommand($"{i}"))
{
Title = $"Copy text {i}"
}).ToArray();
}
}
接下来,将<ExtensionName>Page.cs
更新为包含此新页面:
public override IListItem[] GetItems()
{
OpenUrlCommand command = new("https://learn.microsoft.com/windows/powertoys/command-palette/creating-an-extension");
return [
new ListItem(command)
{
Title = "Open the Command Palette documentation",
},
new ListItem(new ShowMessageCommand()),
+ new ListItem(new MySecondPage()) { Title = "My second page", Subtitle = "A second page of commands" },
];
}
部署、重新加载,现在应在扩展中看到一个新页面,其中显示了 100 个命令,用于将数字复制到剪贴板。