Files
PowerToys/src/modules/cmdpal/ext/SamplePagesExtension/SamplesListPage.cs
Mike Griese d944b8728c cmdpal: A sample for tracking load/unload for pages (#39265)
Committing this sample for posterity's sake.

This is the product of an experiment: "can an extension know when it's
page was opened / closed?"

And without changing the actual SDK, this **is** possible. It relies on
the fact that CmdPal (the host) needs to register for the `ItemsChanged`
event on list pages, and it does that when the page is loaded, and it
unregisters itself when the page is closed.

This does require manually implementing `IListPage` - you can't just
`override` the `event` in the base class ([that's
illegal](https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1070)),
and using `new` to shadow it doesn't work either (probably for cswinrt
reasons).

This is the best I came up with.
2025-07-09 21:05:20 -05:00

98 lines
3.3 KiB
C#

// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit;
namespace SamplePagesExtension;
public partial class SamplesListPage : ListPage
{
private readonly IListItem[] _commands = [
// List pages
new ListItem(new SampleListPage())
{
Title = "List Page Sample Command",
Subtitle = "Display a list of items",
},
new ListItem(new SampleListPageWithDetails())
{
Title = "List Page With Details",
Subtitle = "A list of items, each with additional details to display",
},
new ListItem(new SampleUpdatingItemsPage())
{
Title = "List page with items that change",
Subtitle = "The items on the list update themselves in real time",
},
new ListItem(new SampleDynamicListPage())
{
Title = "Dynamic List Page Command",
Subtitle = "Changes the list of items in response to the typed query",
},
new ListItem(new OnLoadPage())
{
Title = "Demo of OnLoad/OnUnload",
Subtitle = "Changes the list of items every time the page is opened / closed",
},
// Content pages
new ListItem(new SampleContentPage())
{
Title = "Sample content page",
Subtitle = "Display mixed forms, markdown, and other types of content",
},
new ListItem(new SampleTreeContentPage())
{
Title = "Sample nested content",
Subtitle = "Example of nesting a tree of content",
},
new ListItem(new SampleCommentsPage())
{
Title = "Sample of nested comments",
Subtitle = "Demo of using nested trees of content to create a comment thread-like experience",
Icon = new IconInfo("\uE90A"), // Comment
},
new ListItem(new SampleMarkdownPage())
{
Title = "Markdown Page Sample Command",
Subtitle = "Display a page of rendered markdown",
},
new ListItem(new SampleMarkdownManyBodies())
{
Title = "Markdown with multiple blocks",
Subtitle = "A page with multiple blocks of rendered markdown",
},
new ListItem(new SampleMarkdownDetails())
{
Title = "Markdown with details",
Subtitle = "A page with markdown and details",
},
// Settings helpers
new ListItem(new SampleSettingsPage())
{
Title = "Sample settings page",
Subtitle = "A demo of the settings helpers",
},
// Evil edge cases
// Anything weird that might break the palette - put that in here.
new ListItem(new EvilSamplesPage())
{
Title = "Evil samples",
Subtitle = "Samples designed to break the palette in many different evil ways",
}
];
public SamplesListPage()
{
Name = "Samples";
Icon = new IconInfo("\ue946"); // Info
}
public override IListItem[] GetItems() => _commands;
}