基于 SOC 职业分类
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill maui-shell-navigation命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
| name | maui-shell-navigation |
| description | > Use when this capability is needed. |
Always use ContentTemplate with DataTemplate so pages are created on demand.
Using Content directly creates all pages during Shell init, hurting startup time.
<!-- ✅ Lazy — page created on first navigation -->
<ShellContent ContentTemplate="{DataTemplate views:HomePage}" />
<!-- ❌ Eager — page created at Shell startup -->
<ShellContent>
<views:HomePage />
</ShellContent>
IQueryAttributable gives you all parameters in one call and works on ViewModels:
public class AnimalDetailsViewModel : ObservableObject, IQueryAttributable
{
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
if (query.TryGetValue("id", out var id))
AnimalId = id.ToString();
}
}
For complex objects, use ShellNavigationQueryParameters to avoid serializing:
var parameters = new ShellNavigationQueryParameters
{
{ "animal", selectedAnimal }
};
await Shell.Current.GoToAsync("animaldetails", parameters);
Use GetDeferral() for async checks (e.g., "save unsaved changes?"):
protected override async void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
if (hasUnsavedChanges && args.Source == ShellNavigationSource.Pop)
{
var deferral = args.GetDeferral();
bool discard = await ShowConfirmationDialog();
if (!discard)
args.Cancel();
deferral.Complete();
}
}
Duplicate route names — Routing.RegisterRoute throws ArgumentException
if a route name is already registered or matches a visual hierarchy route.
Every route must be unique across the entire app.
Relative routes require registration — you cannot GoToAsync("somepage")
unless somepage was registered with Routing.RegisterRoute. Visual hierarchy
pages use absolute // routes instead.
Pages are created on demand — when using ContentTemplate, the page
constructor runs only on first navigation. Don't assume pages exist at startup.
Tab.Stack is read-only — you cannot manipulate the navigation stack directly;
use GoToAsync for all navigation changes.
GoToAsync is async — always await it — fire-and-forget navigation causes race conditions and can silently fail:
// ❌ Fire-and-forget — race conditions
Shell.Current.GoToAsync("details");
// ✅ Always await
await Shell.Current.GoToAsync("details");
Route hierarchy matters — absolute routes must match the full path through
the visual hierarchy (//FlyoutItem/Tab/ShellContent). Getting the path
wrong produces silent no-ops, not exceptions.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.