将命令添加到扩展

上一篇创建扩展。 我们将从本文中创建的项目开始。

创建扩展后,可以向其添加一些命令。

添加一些命令

我们可以先导航到 <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 个命令,用于将数字复制到剪贴板。

下一步: 更新命令列表