[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-maui-shell-navigation":3,"mdc-jow8bd-key":37,"related-org-dotnet-maui-shell-navigation":3045,"related-repo-dotnet-maui-shell-navigation":3211},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"maui-shell-navigation","implement Shell navigation in MAUI","Guide for implementing Shell-based navigation in .NET MAUI apps. Covers AppShell setup, visual hierarchy (FlyoutItem, TabBar, Tab, ShellContent), URI-based navigation with GoToAsync, route registration, query parameters, back navigation, flyout and tab configuration, navigation events, and navigation guards. Use when: setting up Shell navigation, adding tabs or flyout menus, navigating between pages with GoToAsync, passing parameters between pages, registering routes, customizing back button behavior, or guarding navigation with confirmation dialogs. Do not use for: deep linking from external URLs (see .NET MAUI deep linking documentation), data binding on pages (use maui-data-binding), dependency injection setup (use maui-dependency-injection), or NavigationPage-only apps that don't use Shell.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"MAUI","maui","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Mobile","mobile",{"name":23,"slug":24,"type":15},"Navigation","navigation",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-08-01T05:42:25.161226","MIT",332,[31],"agent-skills",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-maui\u002Fskills\u002Fmaui-shell-navigation","---\nname: maui-shell-navigation\ndescription: >-\n  Guide for implementing Shell-based navigation in .NET MAUI apps. Covers AppShell\n  setup, visual hierarchy (FlyoutItem, TabBar, Tab, ShellContent), URI-based navigation\n  with GoToAsync, route registration, query parameters, back navigation, flyout and\n  tab configuration, navigation events, and navigation guards.\n  Use when: setting up Shell navigation, adding tabs or flyout menus, navigating between\n  pages with GoToAsync, passing parameters between pages, registering routes, customizing\n  back button behavior, or guarding navigation with confirmation dialogs.\n  Do not use for: deep linking from external URLs (see .NET MAUI deep linking\n  documentation), data binding on pages (use maui-data-binding), dependency injection\n  setup (use maui-dependency-injection), or NavigationPage-only apps that don't use Shell.\nlicense: MIT\n---\n\n# .NET MAUI Shell Navigation\n\nImplement page navigation in .NET MAUI apps using Shell. Shell provides URI-based navigation, a flyout menu, tab bars, and a four-level visual hierarchy — all configured declaratively in XAML.\n\n## When to Use\n\n- Setting up top-level app navigation with tabs or a flyout menu\n- Navigating between pages programmatically with `GoToAsync`\n- Passing data between pages via query parameters or object parameters\n- Registering detail-page routes for push navigation\n- Guarding navigation with confirmation dialogs (e.g., unsaved changes)\n- Customizing back button behavior per page\n\n## When Not to Use\n\n- Deep linking from external URLs or app links — see [.NET MAUI deep linking docs](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fapp-links)\n- Data binding on navigation target pages — use `maui-data-binding`\n- Dependency injection for pages and view models — use `maui-dependency-injection`\n- Apps using `NavigationPage` without Shell (different navigation API)\n\n## Inputs\n\n- A .NET MAUI project with `AppShell.xaml` as the root shell\n- Pages (`ContentPage`) to navigate between\n- Route names for detail pages not in the visual hierarchy\n\n## Rules That Change the Answer\n\nThese are the Shell-specific decisions that are easy to get wrong. Apply them\nwhenever they are relevant to what the user asked.\n\n| Situation | Do this | Not this |\n|---|---|---|\n| Declaring pages in `AppShell.xaml` | With `xmlns:views=\"clr-namespace:MyApp.Views\"` declared: `\u003CShellContent ContentTemplate=\"{DataTemplate views:MyPage}\" \u002F>` — the page is created on first navigation | `\u003CShellContent>\u003Cviews:MyPage \u002F>\u003C\u002FShellContent>`, which constructs **every** page at startup |\n| Navigating to a page not in the visual hierarchy | `Routing.RegisterRoute(\"details\", typeof(DetailsPage))` first | Calling `GoToAsync(\"details\")` unregistered — it throws at runtime |\n| Receiving navigation parameters | Implement `IQueryAttributable` on the **ViewModel** | Implementing it on the Page, which splits state from the BindingContext |\n| Passing a whole object | `ShellNavigationQueryParameters` | Serialising the object into the query string |\n| Any `GoToAsync` call | `await` it | Fire-and-forget — exceptions are swallowed and navigation races |\n| Confirming before back navigation | `ShellNavigatingEventArgs.GetDeferral()` … `deferral.Complete()` | Blocking synchronously on the dialog task |\n| Detecting back navigation | Check `e.Source == ShellNavigationSource.Pop` | Assuming every navigation is a back action |\n\n**Do not** propose `NavigationPage` \u002F `PushAsync` solutions for a Shell app, and do\nnot restructure a working `AppShell` hierarchy unless the user asked.\n\n**Answer narrowly, but completely.** Staying on topic does not mean being terse. When\nyou show a navigation change, include the pieces needed to run it: the `AppShell.xaml`\nmarkup *and* the `Routing.RegisterRoute` call, or the `GoToAsync` call *and* the\nreceiving `IQueryAttributable` \u002F `[QueryProperty]` code. Where two approaches are both\nvalid (query string vs `ShellNavigationQueryParameters`), show both and say when each\nfits — a single snippet the user still has to complete is a worse answer.\n\n## Shell Visual Hierarchy\n\nShell uses a four-level hierarchy. Each level wraps the one below it:\n\n```\nShell\n ├── FlyoutItem \u002F TabBar          (top-level grouping)\n │    ├── Tab                     (bottom-tab grouping)\n │    │    ├── ShellContent        (page slot → ContentPage)\n │    │    └── ShellContent        (multiple = top tabs)\n │    └── Tab\n └── FlyoutItem \u002F TabBar\n```\n\n- **FlyoutItem** — appears in the flyout menu; contains `Tab` children\n- **TabBar** — bottom tab bar with no flyout entry\n- **Tab** — groups `ShellContent`; multiple children produce top tabs\n- **ShellContent** — each points to a `ContentPage`\n\n### Implicit Conversion\n\nYou can omit intermediate wrappers. Shell auto-wraps:\n\n| You write                    | Shell creates                         |\n|------------------------------|---------------------------------------|\n| `ShellContent` only          | `FlyoutItem > Tab > ShellContent`     |\n| `Tab` only                   | `FlyoutItem > Tab`                    |\n| `ShellContent` in `TabBar`   | `TabBar > Tab > ShellContent`         |\n\n## Workflow: Set Up AppShell\n\n1. Define `AppShell.xaml` inheriting from `Shell`\n2. Add `FlyoutItem` or `TabBar` elements for top-level navigation\n3. Add `Tab` elements for bottom tabs; nest multiple `ShellContent` for top tabs\n4. **Always use `ContentTemplate`** with `DataTemplate` so pages load on demand\n5. **Give every `ShellContent` an explicit `Route`** (see below)\n6. Register detail-page routes in the `AppShell` constructor\n\n> **Set `Route=` on every `ShellContent`.** If you omit it, MAUI auto-generates a\n> name from a shared counter — `Routing.cs` produces `D_FAULT_{TypeName}{n}`. A real\n> shell with three unnamed `ShellContent` elements yields routes like\n> `D_FAULT_ShellContent2` and `D_FAULT_ShellContent5`: the numbers are not\n> sequential, they depend on how many Shell elements were constructed first, and they\n> shift when you reorder or add pages. You cannot write a stable absolute route\n> (`\u002F\u002Fdashboard`) or deep link against that. An explicit `Route=\"dashboard\"` is stable\n> forever.\n\n```xml\n\u003CShell xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n       xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n       xmlns:views=\"clr-namespace:MyApp.Views\"\n       x:Class=\"MyApp.AppShell\"\n       FlyoutBehavior=\"Flyout\">\n\n    \u003CFlyoutItem Title=\"Animals\" Icon=\"animals.png\">\n        \u003CTab Title=\"Cats\">\n            \u003CShellContent Title=\"Domestic\" Route=\"domesticcats\"\n                          ContentTemplate=\"{DataTemplate views:DomesticCatsPage}\" \u002F>\n            \u003CShellContent Title=\"Wild\" Route=\"wildcats\"\n                          ContentTemplate=\"{DataTemplate views:WildCatsPage}\" \u002F>\n        \u003C\u002FTab>\n        \u003CTab Title=\"Dogs\" Icon=\"dogs.png\">\n            \u003CShellContent Route=\"dogs\" ContentTemplate=\"{DataTemplate views:DogsPage}\" \u002F>\n        \u003C\u002FTab>\n    \u003C\u002FFlyoutItem>\n\n    \u003CTabBar>\n        \u003CShellContent Title=\"Home\" Icon=\"home.png\" Route=\"home\"\n                      ContentTemplate=\"{DataTemplate views:HomePage}\" \u002F>\n        \u003CShellContent Title=\"Settings\" Icon=\"settings.png\" Route=\"settings\"\n                      ContentTemplate=\"{DataTemplate views:SettingsPage}\" \u002F>\n    \u003C\u002FTabBar>\n\u003C\u002FShell>\n```\n\n```csharp\n\u002F\u002F AppShell.xaml.cs\npublic partial class AppShell : Shell\n{\n    public AppShell()\n    {\n        InitializeComponent();\n        Routing.RegisterRoute(\"animaldetails\", typeof(AnimalDetailsPage));\n        Routing.RegisterRoute(\"editanimal\", typeof(EditAnimalPage));\n    }\n}\n```\n\n## Workflow: Navigate with GoToAsync\n\nAll programmatic navigation uses `Shell.Current.GoToAsync`. Always `await` the call.\n\n### Route Prefixes\n\n| Prefix | Meaning                                     |\n|--------|---------------------------------------------|\n| `\u002F\u002F`   | Absolute route from Shell root              |\n| (none) | Relative; pushes onto the current nav stack |\n| `..`   | Go back one level                           |\n| `..\u002F`  | Go back then navigate forward               |\n\n### Navigation Examples\n\n```csharp\n\u002F\u002F 1. Absolute — switch to a specific hierarchy location\nawait Shell.Current.GoToAsync(\"\u002F\u002Fanimals\u002Fcats\u002Fdomestic\");\n\n\u002F\u002F 2. Relative — push a registered detail page\nawait Shell.Current.GoToAsync(\"animaldetails\");\n\n\u002F\u002F 3. With query string parameters\nawait Shell.Current.GoToAsync($\"animaldetails?id={animal.Id}\");\n\n\u002F\u002F 4. Go back one page\nawait Shell.Current.GoToAsync(\"..\");\n\n\u002F\u002F 5. Go back two pages\nawait Shell.Current.GoToAsync(\"..\u002F..\");\n\n\u002F\u002F 6. Go back one page, then push a different page\nawait Shell.Current.GoToAsync(\"..\u002Feditanimal\");\n```\n\n## Workflow: Pass Data Between Pages\n\n### Option 1: IQueryAttributable (Preferred)\n\nImplement on ViewModels to receive all parameters in one call:\n\n```csharp\npublic class AnimalDetailsViewModel : ObservableObject, IQueryAttributable\n{\n    public void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n    {\n        if (query.TryGetValue(\"id\", out var id))\n            AnimalId = id.ToString();\n    }\n}\n```\n\n### Option 2: QueryProperty Attribute\n\nApply on the **ViewModel** class (or the page, if it genuinely owns the state).\nPrefer `IQueryAttributable` on the ViewModel — it keeps navigation state with the\n`BindingContext` and handles multiple parameters in one call:\n\n```csharp\n[QueryProperty(nameof(AnimalId), \"id\")]\npublic partial class AnimalDetailsViewModel : ObservableObject\n{\n    [ObservableProperty]\n    private string _animalId = string.Empty;\n}\n```\n\nShell applies query attributes *after* the page constructor sets `BindingContext`,\nso the property must raise change notification — a plain auto-property leaves the\nbinding stuck on its initial value.\n\n### Option 3: Complex Objects via ShellNavigationQueryParameters\n\nPass objects without serializing to strings:\n\n```csharp\nvar parameters = new ShellNavigationQueryParameters\n{\n    { \"animal\", selectedAnimal }\n};\nawait Shell.Current.GoToAsync(\"animaldetails\", parameters);\n```\n\nReceive via `IQueryAttributable`:\n\n```csharp\npublic void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n{\n    Animal = query[\"animal\"] as Animal;\n}\n```\n\n## Workflow: Guard Navigation\n\nUse `GetDeferral()` in `OnNavigating` for async checks (e.g., \"save unsaved changes?\"):\n\n```csharp\n\u002F\u002F In AppShell.xaml.cs\nprotected override async void OnNavigating(ShellNavigatingEventArgs args)\n{\n    base.OnNavigating(args);\n    if (hasUnsavedChanges && args.Source == ShellNavigationSource.Pop)\n    {\n        var deferral = args.GetDeferral();\n        bool discard = await ShowConfirmationDialog();\n        if (!discard)\n            args.Cancel();\n        deferral.Complete();\n    }\n}\n```\n\n## Tab Configuration\n\n### Bottom Tabs\n\nMultiple `ShellContent` (or `Tab`) children inside a `TabBar` or `FlyoutItem` produce bottom tabs.\n\n### Top Tabs\n\nMultiple `ShellContent` children inside a single `Tab` produce top tabs:\n\n```xml\n\u003CTab Title=\"Photos\">\n    \u003CShellContent Title=\"Recent\"    ContentTemplate=\"{DataTemplate views:RecentPage}\" \u002F>\n    \u003CShellContent Title=\"Favorites\" ContentTemplate=\"{DataTemplate views:FavoritesPage}\" \u002F>\n\u003C\u002FTab>\n```\n\n### Tab Bar Appearance\n\n| Attached Property              | Type    | Purpose                        |\n|--------------------------------|---------|--------------------------------|\n| `Shell.TabBarBackgroundColor`  | `Color` | Tab bar background             |\n| `Shell.TabBarForegroundColor`  | `Color` | Selected icon color            |\n| `Shell.TabBarTitleColor`       | `Color` | Selected tab title color       |\n| `Shell.TabBarUnselectedColor`  | `Color` | Unselected tab icon\u002Ftitle      |\n| `Shell.TabBarIsVisible`        | `bool`  | Show\u002Fhide the tab bar          |\n\n```xml\n\u003C!-- Hide the tab bar on a specific page -->\n\u003CContentPage Shell.TabBarIsVisible=\"False\" ... \u002F>\n```\n\n## Flyout Configuration\n\n### FlyoutBehavior\n\nSet on `Shell`: `Disabled`, `Flyout`, or `Locked`.\n\n```xml\n\u003CShell FlyoutBehavior=\"Flyout\"> ... \u003C\u002FShell>\n```\n\n### FlyoutDisplayOptions\n\nControls how children appear in the flyout:\n\n- `AsSingleItem` (default) — one flyout entry for the group\n- `AsMultipleItems` — each child `Tab` gets its own entry\n\n```xml\n\u003CFlyoutItem Title=\"Animals\" FlyoutDisplayOptions=\"AsMultipleItems\">\n    \u003CTab Title=\"Cats\" ... \u002F>\n    \u003CTab Title=\"Dogs\" ... \u002F>\n\u003C\u002FFlyoutItem>\n```\n\n### MenuItem (Non-Navigation Flyout Entries)\n\n```xml\n\u003CMenuItem Text=\"Log Out\"\n          Command=\"{Binding LogOutCommand}\"\n          IconImageSource=\"logout.png\" \u002F>\n```\n\n## Back Button Behavior\n\nCustomize the back button per page:\n\n```xml\n\u003CShell.BackButtonBehavior>\n    \u003CBackButtonBehavior Command=\"{Binding BackCommand}\"\n                       IconOverride=\"back_arrow.png\"\n                       TextOverride=\"Cancel\"\n                       IsVisible=\"True\" \u002F>\n\u003C\u002FShell.BackButtonBehavior>\n```\n\nProperties: `Command`, `CommandParameter`, `IconOverride`, `TextOverride`, `IsVisible`, `IsEnabled`.\n\n## Inspecting Navigation State\n\n```csharp\n\u002F\u002F Current URI location\nstring location = Shell.Current.CurrentState.Location.ToString();\n\n\u002F\u002F Current page\nPage page = Shell.Current.CurrentPage;\n\n\u002F\u002F Navigation stack of the current tab\nIReadOnlyList\u003CPage> stack = Shell.Current.Navigation.NavigationStack;\n```\n\n## Navigation Events\n\nOverride in `AppShell`:\n\n```csharp\nprotected override void OnNavigated(ShellNavigatedEventArgs args)\n{\n    base.OnNavigated(args);\n    \u002F\u002F args.Current, args.Previous, args.Source\n}\n```\n\n`ShellNavigationSource` values: `Push`, `Pop`, `PopToRoot`, `Insert`, `Remove`, `ShellItemChanged`, `ShellSectionChanged`, `ShellContentChanged`, `Unknown`.\n\n## Common Pitfalls\n\n- **Eager page creation**: Using `Content` directly instead of `ContentTemplate` with `DataTemplate` creates all pages at Shell init, hurting startup time. Always use `ContentTemplate`.\n- **Duplicate route names**: `Routing.RegisterRoute` throws `ArgumentException` if a route name matches an existing route or a visual hierarchy route. Every route must be unique across the app.\n- **Relative routes without registration**: You cannot `GoToAsync(\"somepage\")` unless `somepage` was registered with `Routing.RegisterRoute`. Visual hierarchy pages use absolute `\u002F\u002F` routes.\n- **Fire-and-forget GoToAsync**: Not awaiting `GoToAsync` causes race conditions and silent failures. Always `await` the call.\n- **Wrong absolute route path**: Absolute routes must match the full path through the visual hierarchy (`\u002F\u002FFlyoutItem\u002FTab\u002FShellContent`). Wrong paths produce silent no-ops, not exceptions.\n- **Manipulating Tab.Stack directly**: The navigation stack is read-only. Use `GoToAsync` for all navigation changes.\n- **Forgetting `GetDeferral()` for async guards**: Synchronous cancellation in `OnNavigating` works, but async checks require `GetDeferral()` \u002F `deferral.Complete()` to avoid race conditions.\n\n## References\n\n- `references\u002Fshell-navigation-api.md` — Full API reference for Shell hierarchy, routes, tabs, flyout, and navigation\n- [.NET MAUI Shell Navigation](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fnavigation)\n- [.NET MAUI Shell Tabs](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Ftabs)\n- [.NET MAUI Shell Flyout](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fflyout)\n- [.NET MAUI Shell Pages](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fpages)\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,57,64,106,112,164,170,204,210,215,471,504,571,577,582,594,656,663,668,760,766,884,968,1203,1292,1298,1318,1324,1410,1416,1554,1560,1566,1571,1638,1644,1670,1723,1742,1748,1753,1799,1811,1848,1854,1874,1981,1987,1993,2025,2031,2049,2088,2094,2248,2271,2277,2283,2318,2332,2338,2343,2375,2414,2420,2451,2457,2462,2517,2564,2570,2639,2645,2656,2701,2775,2781,2980,2986,3039],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"net-maui-shell-navigation",[48],{"type":49,"value":50},"text",".NET MAUI Shell Navigation",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Implement page navigation in .NET MAUI apps using Shell. Shell provides URI-based navigation, a flyout menu, tab bars, and a four-level visual hierarchy — all configured declaratively in XAML.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"when-to-use",[62],{"type":49,"value":63},"When to Use",{"type":43,"tag":65,"props":66,"children":67},"ul",{},[68,74,86,91,96,101],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72],{"type":49,"value":73},"Setting up top-level app navigation with tabs or a flyout menu",{"type":43,"tag":69,"props":75,"children":76},{},[77,79],{"type":49,"value":78},"Navigating between pages programmatically with ",{"type":43,"tag":80,"props":81,"children":83},"code",{"className":82},[],[84],{"type":49,"value":85},"GoToAsync",{"type":43,"tag":69,"props":87,"children":88},{},[89],{"type":49,"value":90},"Passing data between pages via query parameters or object parameters",{"type":43,"tag":69,"props":92,"children":93},{},[94],{"type":49,"value":95},"Registering detail-page routes for push navigation",{"type":43,"tag":69,"props":97,"children":98},{},[99],{"type":49,"value":100},"Guarding navigation with confirmation dialogs (e.g., unsaved changes)",{"type":43,"tag":69,"props":102,"children":103},{},[104],{"type":49,"value":105},"Customizing back button behavior per page",{"type":43,"tag":58,"props":107,"children":109},{"id":108},"when-not-to-use",[110],{"type":49,"value":111},"When Not to Use",{"type":43,"tag":65,"props":113,"children":114},{},[115,129,140,151],{"type":43,"tag":69,"props":116,"children":117},{},[118,120],{"type":49,"value":119},"Deep linking from external URLs or app links — see ",{"type":43,"tag":121,"props":122,"children":126},"a",{"href":123,"rel":124},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fapp-links",[125],"nofollow",[127],{"type":49,"value":128},".NET MAUI deep linking docs",{"type":43,"tag":69,"props":130,"children":131},{},[132,134],{"type":49,"value":133},"Data binding on navigation target pages — use ",{"type":43,"tag":80,"props":135,"children":137},{"className":136},[],[138],{"type":49,"value":139},"maui-data-binding",{"type":43,"tag":69,"props":141,"children":142},{},[143,145],{"type":49,"value":144},"Dependency injection for pages and view models — use ",{"type":43,"tag":80,"props":146,"children":148},{"className":147},[],[149],{"type":49,"value":150},"maui-dependency-injection",{"type":43,"tag":69,"props":152,"children":153},{},[154,156,162],{"type":49,"value":155},"Apps using ",{"type":43,"tag":80,"props":157,"children":159},{"className":158},[],[160],{"type":49,"value":161},"NavigationPage",{"type":49,"value":163}," without Shell (different navigation API)",{"type":43,"tag":58,"props":165,"children":167},{"id":166},"inputs",[168],{"type":49,"value":169},"Inputs",{"type":43,"tag":65,"props":171,"children":172},{},[173,186,199],{"type":43,"tag":69,"props":174,"children":175},{},[176,178,184],{"type":49,"value":177},"A .NET MAUI project with ",{"type":43,"tag":80,"props":179,"children":181},{"className":180},[],[182],{"type":49,"value":183},"AppShell.xaml",{"type":49,"value":185}," as the root shell",{"type":43,"tag":69,"props":187,"children":188},{},[189,191,197],{"type":49,"value":190},"Pages (",{"type":43,"tag":80,"props":192,"children":194},{"className":193},[],[195],{"type":49,"value":196},"ContentPage",{"type":49,"value":198},") to navigate between",{"type":43,"tag":69,"props":200,"children":201},{},[202],{"type":49,"value":203},"Route names for detail pages not in the visual hierarchy",{"type":43,"tag":58,"props":205,"children":207},{"id":206},"rules-that-change-the-answer",[208],{"type":49,"value":209},"Rules That Change the Answer",{"type":43,"tag":52,"props":211,"children":212},{},[213],{"type":49,"value":214},"These are the Shell-specific decisions that are easy to get wrong. Apply them\nwhenever they are relevant to what the user asked.",{"type":43,"tag":216,"props":217,"children":218},"table",{},[219,243],{"type":43,"tag":220,"props":221,"children":222},"thead",{},[223],{"type":43,"tag":224,"props":225,"children":226},"tr",{},[227,233,238],{"type":43,"tag":228,"props":229,"children":230},"th",{},[231],{"type":49,"value":232},"Situation",{"type":43,"tag":228,"props":234,"children":235},{},[236],{"type":49,"value":237},"Do this",{"type":43,"tag":228,"props":239,"children":240},{},[241],{"type":49,"value":242},"Not this",{"type":43,"tag":244,"props":245,"children":246},"tbody",{},[247,301,333,364,386,417,447],{"type":43,"tag":224,"props":248,"children":249},{},[250,261,282],{"type":43,"tag":251,"props":252,"children":253},"td",{},[254,256],{"type":49,"value":255},"Declaring pages in ",{"type":43,"tag":80,"props":257,"children":259},{"className":258},[],[260],{"type":49,"value":183},{"type":43,"tag":251,"props":262,"children":263},{},[264,266,272,274,280],{"type":49,"value":265},"With ",{"type":43,"tag":80,"props":267,"children":269},{"className":268},[],[270],{"type":49,"value":271},"xmlns:views=\"clr-namespace:MyApp.Views\"",{"type":49,"value":273}," declared: ",{"type":43,"tag":80,"props":275,"children":277},{"className":276},[],[278],{"type":49,"value":279},"\u003CShellContent ContentTemplate=\"{DataTemplate views:MyPage}\" \u002F>",{"type":49,"value":281}," — the page is created on first navigation",{"type":43,"tag":251,"props":283,"children":284},{},[285,291,293,299],{"type":43,"tag":80,"props":286,"children":288},{"className":287},[],[289],{"type":49,"value":290},"\u003CShellContent>\u003Cviews:MyPage \u002F>\u003C\u002FShellContent>",{"type":49,"value":292},", which constructs ",{"type":43,"tag":294,"props":295,"children":296},"strong",{},[297],{"type":49,"value":298},"every",{"type":49,"value":300}," page at startup",{"type":43,"tag":224,"props":302,"children":303},{},[304,309,320],{"type":43,"tag":251,"props":305,"children":306},{},[307],{"type":49,"value":308},"Navigating to a page not in the visual hierarchy",{"type":43,"tag":251,"props":310,"children":311},{},[312,318],{"type":43,"tag":80,"props":313,"children":315},{"className":314},[],[316],{"type":49,"value":317},"Routing.RegisterRoute(\"details\", typeof(DetailsPage))",{"type":49,"value":319}," first",{"type":43,"tag":251,"props":321,"children":322},{},[323,325,331],{"type":49,"value":324},"Calling ",{"type":43,"tag":80,"props":326,"children":328},{"className":327},[],[329],{"type":49,"value":330},"GoToAsync(\"details\")",{"type":49,"value":332}," unregistered — it throws at runtime",{"type":43,"tag":224,"props":334,"children":335},{},[336,341,359],{"type":43,"tag":251,"props":337,"children":338},{},[339],{"type":49,"value":340},"Receiving navigation parameters",{"type":43,"tag":251,"props":342,"children":343},{},[344,346,352,354],{"type":49,"value":345},"Implement ",{"type":43,"tag":80,"props":347,"children":349},{"className":348},[],[350],{"type":49,"value":351},"IQueryAttributable",{"type":49,"value":353}," on the ",{"type":43,"tag":294,"props":355,"children":356},{},[357],{"type":49,"value":358},"ViewModel",{"type":43,"tag":251,"props":360,"children":361},{},[362],{"type":49,"value":363},"Implementing it on the Page, which splits state from the BindingContext",{"type":43,"tag":224,"props":365,"children":366},{},[367,372,381],{"type":43,"tag":251,"props":368,"children":369},{},[370],{"type":49,"value":371},"Passing a whole object",{"type":43,"tag":251,"props":373,"children":374},{},[375],{"type":43,"tag":80,"props":376,"children":378},{"className":377},[],[379],{"type":49,"value":380},"ShellNavigationQueryParameters",{"type":43,"tag":251,"props":382,"children":383},{},[384],{"type":49,"value":385},"Serialising the object into the query string",{"type":43,"tag":224,"props":387,"children":388},{},[389,401,412],{"type":43,"tag":251,"props":390,"children":391},{},[392,394,399],{"type":49,"value":393},"Any ",{"type":43,"tag":80,"props":395,"children":397},{"className":396},[],[398],{"type":49,"value":85},{"type":49,"value":400}," call",{"type":43,"tag":251,"props":402,"children":403},{},[404,410],{"type":43,"tag":80,"props":405,"children":407},{"className":406},[],[408],{"type":49,"value":409},"await",{"type":49,"value":411}," it",{"type":43,"tag":251,"props":413,"children":414},{},[415],{"type":49,"value":416},"Fire-and-forget — exceptions are swallowed and navigation races",{"type":43,"tag":224,"props":418,"children":419},{},[420,425,442],{"type":43,"tag":251,"props":421,"children":422},{},[423],{"type":49,"value":424},"Confirming before back navigation",{"type":43,"tag":251,"props":426,"children":427},{},[428,434,436],{"type":43,"tag":80,"props":429,"children":431},{"className":430},[],[432],{"type":49,"value":433},"ShellNavigatingEventArgs.GetDeferral()",{"type":49,"value":435}," … ",{"type":43,"tag":80,"props":437,"children":439},{"className":438},[],[440],{"type":49,"value":441},"deferral.Complete()",{"type":43,"tag":251,"props":443,"children":444},{},[445],{"type":49,"value":446},"Blocking synchronously on the dialog task",{"type":43,"tag":224,"props":448,"children":449},{},[450,455,466],{"type":43,"tag":251,"props":451,"children":452},{},[453],{"type":49,"value":454},"Detecting back navigation",{"type":43,"tag":251,"props":456,"children":457},{},[458,460],{"type":49,"value":459},"Check ",{"type":43,"tag":80,"props":461,"children":463},{"className":462},[],[464],{"type":49,"value":465},"e.Source == ShellNavigationSource.Pop",{"type":43,"tag":251,"props":467,"children":468},{},[469],{"type":49,"value":470},"Assuming every navigation is a back action",{"type":43,"tag":52,"props":472,"children":473},{},[474,479,481,486,488,494,496,502],{"type":43,"tag":294,"props":475,"children":476},{},[477],{"type":49,"value":478},"Do not",{"type":49,"value":480}," propose ",{"type":43,"tag":80,"props":482,"children":484},{"className":483},[],[485],{"type":49,"value":161},{"type":49,"value":487}," \u002F ",{"type":43,"tag":80,"props":489,"children":491},{"className":490},[],[492],{"type":49,"value":493},"PushAsync",{"type":49,"value":495}," solutions for a Shell app, and do\nnot restructure a working ",{"type":43,"tag":80,"props":497,"children":499},{"className":498},[],[500],{"type":49,"value":501},"AppShell",{"type":49,"value":503}," hierarchy unless the user asked.",{"type":43,"tag":52,"props":505,"children":506},{},[507,512,514,519,521,527,529,535,537,542,544,548,550,555,556,562,564,569],{"type":43,"tag":294,"props":508,"children":509},{},[510],{"type":49,"value":511},"Answer narrowly, but completely.",{"type":49,"value":513}," Staying on topic does not mean being terse. When\nyou show a navigation change, include the pieces needed to run it: the ",{"type":43,"tag":80,"props":515,"children":517},{"className":516},[],[518],{"type":49,"value":183},{"type":49,"value":520},"\nmarkup ",{"type":43,"tag":522,"props":523,"children":524},"em",{},[525],{"type":49,"value":526},"and",{"type":49,"value":528}," the ",{"type":43,"tag":80,"props":530,"children":532},{"className":531},[],[533],{"type":49,"value":534},"Routing.RegisterRoute",{"type":49,"value":536}," call, or the ",{"type":43,"tag":80,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":85},{"type":49,"value":543}," call ",{"type":43,"tag":522,"props":545,"children":546},{},[547],{"type":49,"value":526},{"type":49,"value":549}," the\nreceiving ",{"type":43,"tag":80,"props":551,"children":553},{"className":552},[],[554],{"type":49,"value":351},{"type":49,"value":487},{"type":43,"tag":80,"props":557,"children":559},{"className":558},[],[560],{"type":49,"value":561},"[QueryProperty]",{"type":49,"value":563}," code. Where two approaches are both\nvalid (query string vs ",{"type":43,"tag":80,"props":565,"children":567},{"className":566},[],[568],{"type":49,"value":380},{"type":49,"value":570},"), show both and say when each\nfits — a single snippet the user still has to complete is a worse answer.",{"type":43,"tag":58,"props":572,"children":574},{"id":573},"shell-visual-hierarchy",[575],{"type":49,"value":576},"Shell Visual Hierarchy",{"type":43,"tag":52,"props":578,"children":579},{},[580],{"type":49,"value":581},"Shell uses a four-level hierarchy. Each level wraps the one below it:",{"type":43,"tag":583,"props":584,"children":588},"pre",{"className":585,"code":587,"language":49},[586],"language-text","Shell\n ├── FlyoutItem \u002F TabBar          (top-level grouping)\n │    ├── Tab                     (bottom-tab grouping)\n │    │    ├── ShellContent        (page slot → ContentPage)\n │    │    └── ShellContent        (multiple = top tabs)\n │    └── Tab\n └── FlyoutItem \u002F TabBar\n",[589],{"type":43,"tag":80,"props":590,"children":592},{"__ignoreMap":591},"",[593],{"type":49,"value":587},{"type":43,"tag":65,"props":595,"children":596},{},[597,615,625,642],{"type":43,"tag":69,"props":598,"children":599},{},[600,605,607,613],{"type":43,"tag":294,"props":601,"children":602},{},[603],{"type":49,"value":604},"FlyoutItem",{"type":49,"value":606}," — appears in the flyout menu; contains ",{"type":43,"tag":80,"props":608,"children":610},{"className":609},[],[611],{"type":49,"value":612},"Tab",{"type":49,"value":614}," children",{"type":43,"tag":69,"props":616,"children":617},{},[618,623],{"type":43,"tag":294,"props":619,"children":620},{},[621],{"type":49,"value":622},"TabBar",{"type":49,"value":624}," — bottom tab bar with no flyout entry",{"type":43,"tag":69,"props":626,"children":627},{},[628,632,634,640],{"type":43,"tag":294,"props":629,"children":630},{},[631],{"type":49,"value":612},{"type":49,"value":633}," — groups ",{"type":43,"tag":80,"props":635,"children":637},{"className":636},[],[638],{"type":49,"value":639},"ShellContent",{"type":49,"value":641},"; multiple children produce top tabs",{"type":43,"tag":69,"props":643,"children":644},{},[645,649,651],{"type":43,"tag":294,"props":646,"children":647},{},[648],{"type":49,"value":639},{"type":49,"value":650}," — each points to a ",{"type":43,"tag":80,"props":652,"children":654},{"className":653},[],[655],{"type":49,"value":196},{"type":43,"tag":657,"props":658,"children":660},"h3",{"id":659},"implicit-conversion",[661],{"type":49,"value":662},"Implicit Conversion",{"type":43,"tag":52,"props":664,"children":665},{},[666],{"type":49,"value":667},"You can omit intermediate wrappers. Shell auto-wraps:",{"type":43,"tag":216,"props":669,"children":670},{},[671,687],{"type":43,"tag":220,"props":672,"children":673},{},[674],{"type":43,"tag":224,"props":675,"children":676},{},[677,682],{"type":43,"tag":228,"props":678,"children":679},{},[680],{"type":49,"value":681},"You write",{"type":43,"tag":228,"props":683,"children":684},{},[685],{"type":49,"value":686},"Shell creates",{"type":43,"tag":244,"props":688,"children":689},{},[690,712,733],{"type":43,"tag":224,"props":691,"children":692},{},[693,703],{"type":43,"tag":251,"props":694,"children":695},{},[696,701],{"type":43,"tag":80,"props":697,"children":699},{"className":698},[],[700],{"type":49,"value":639},{"type":49,"value":702}," only",{"type":43,"tag":251,"props":704,"children":705},{},[706],{"type":43,"tag":80,"props":707,"children":709},{"className":708},[],[710],{"type":49,"value":711},"FlyoutItem > Tab > ShellContent",{"type":43,"tag":224,"props":713,"children":714},{},[715,724],{"type":43,"tag":251,"props":716,"children":717},{},[718,723],{"type":43,"tag":80,"props":719,"children":721},{"className":720},[],[722],{"type":49,"value":612},{"type":49,"value":702},{"type":43,"tag":251,"props":725,"children":726},{},[727],{"type":43,"tag":80,"props":728,"children":730},{"className":729},[],[731],{"type":49,"value":732},"FlyoutItem > Tab",{"type":43,"tag":224,"props":734,"children":735},{},[736,751],{"type":43,"tag":251,"props":737,"children":738},{},[739,744,746],{"type":43,"tag":80,"props":740,"children":742},{"className":741},[],[743],{"type":49,"value":639},{"type":49,"value":745}," in ",{"type":43,"tag":80,"props":747,"children":749},{"className":748},[],[750],{"type":49,"value":622},{"type":43,"tag":251,"props":752,"children":753},{},[754],{"type":43,"tag":80,"props":755,"children":757},{"className":756},[],[758],{"type":49,"value":759},"TabBar > Tab > ShellContent",{"type":43,"tag":58,"props":761,"children":763},{"id":762},"workflow-set-up-appshell",[764],{"type":49,"value":765},"Workflow: Set Up AppShell",{"type":43,"tag":767,"props":768,"children":769},"ol",{},[770,788,807,825,849,872],{"type":43,"tag":69,"props":771,"children":772},{},[773,775,780,782],{"type":49,"value":774},"Define ",{"type":43,"tag":80,"props":776,"children":778},{"className":777},[],[779],{"type":49,"value":183},{"type":49,"value":781}," inheriting from ",{"type":43,"tag":80,"props":783,"children":785},{"className":784},[],[786],{"type":49,"value":787},"Shell",{"type":43,"tag":69,"props":789,"children":790},{},[791,793,798,800,805],{"type":49,"value":792},"Add ",{"type":43,"tag":80,"props":794,"children":796},{"className":795},[],[797],{"type":49,"value":604},{"type":49,"value":799}," or ",{"type":43,"tag":80,"props":801,"children":803},{"className":802},[],[804],{"type":49,"value":622},{"type":49,"value":806}," elements for top-level navigation",{"type":43,"tag":69,"props":808,"children":809},{},[810,811,816,818,823],{"type":49,"value":792},{"type":43,"tag":80,"props":812,"children":814},{"className":813},[],[815],{"type":49,"value":612},{"type":49,"value":817}," elements for bottom tabs; nest multiple ",{"type":43,"tag":80,"props":819,"children":821},{"className":820},[],[822],{"type":49,"value":639},{"type":49,"value":824}," for top tabs",{"type":43,"tag":69,"props":826,"children":827},{},[828,839,841,847],{"type":43,"tag":294,"props":829,"children":830},{},[831,833],{"type":49,"value":832},"Always use ",{"type":43,"tag":80,"props":834,"children":836},{"className":835},[],[837],{"type":49,"value":838},"ContentTemplate",{"type":49,"value":840}," with ",{"type":43,"tag":80,"props":842,"children":844},{"className":843},[],[845],{"type":49,"value":846},"DataTemplate",{"type":49,"value":848}," so pages load on demand",{"type":43,"tag":69,"props":850,"children":851},{},[852,870],{"type":43,"tag":294,"props":853,"children":854},{},[855,857,862,864],{"type":49,"value":856},"Give every ",{"type":43,"tag":80,"props":858,"children":860},{"className":859},[],[861],{"type":49,"value":639},{"type":49,"value":863}," an explicit ",{"type":43,"tag":80,"props":865,"children":867},{"className":866},[],[868],{"type":49,"value":869},"Route",{"type":49,"value":871}," (see below)",{"type":43,"tag":69,"props":873,"children":874},{},[875,877,882],{"type":49,"value":876},"Register detail-page routes in the ",{"type":43,"tag":80,"props":878,"children":880},{"className":879},[],[881],{"type":49,"value":501},{"type":49,"value":883}," constructor",{"type":43,"tag":885,"props":886,"children":887},"blockquote",{},[888],{"type":43,"tag":52,"props":889,"children":890},{},[891,911,913,919,921,927,929,934,936,942,944,950,952,958,960,966],{"type":43,"tag":294,"props":892,"children":893},{},[894,896,902,904,909],{"type":49,"value":895},"Set ",{"type":43,"tag":80,"props":897,"children":899},{"className":898},[],[900],{"type":49,"value":901},"Route=",{"type":49,"value":903}," on every ",{"type":43,"tag":80,"props":905,"children":907},{"className":906},[],[908],{"type":49,"value":639},{"type":49,"value":910},".",{"type":49,"value":912}," If you omit it, MAUI auto-generates a\nname from a shared counter — ",{"type":43,"tag":80,"props":914,"children":916},{"className":915},[],[917],{"type":49,"value":918},"Routing.cs",{"type":49,"value":920}," produces ",{"type":43,"tag":80,"props":922,"children":924},{"className":923},[],[925],{"type":49,"value":926},"D_FAULT_{TypeName}{n}",{"type":49,"value":928},". A real\nshell with three unnamed ",{"type":43,"tag":80,"props":930,"children":932},{"className":931},[],[933],{"type":49,"value":639},{"type":49,"value":935}," elements yields routes like\n",{"type":43,"tag":80,"props":937,"children":939},{"className":938},[],[940],{"type":49,"value":941},"D_FAULT_ShellContent2",{"type":49,"value":943}," and ",{"type":43,"tag":80,"props":945,"children":947},{"className":946},[],[948],{"type":49,"value":949},"D_FAULT_ShellContent5",{"type":49,"value":951},": the numbers are not\nsequential, they depend on how many Shell elements were constructed first, and they\nshift when you reorder or add pages. You cannot write a stable absolute route\n(",{"type":43,"tag":80,"props":953,"children":955},{"className":954},[],[956],{"type":49,"value":957},"\u002F\u002Fdashboard",{"type":49,"value":959},") or deep link against that. An explicit ",{"type":43,"tag":80,"props":961,"children":963},{"className":962},[],[964],{"type":49,"value":965},"Route=\"dashboard\"",{"type":49,"value":967}," is stable\nforever.",{"type":43,"tag":583,"props":969,"children":973},{"className":970,"code":971,"language":972,"meta":591,"style":591},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CShell xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n       xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n       xmlns:views=\"clr-namespace:MyApp.Views\"\n       x:Class=\"MyApp.AppShell\"\n       FlyoutBehavior=\"Flyout\">\n\n    \u003CFlyoutItem Title=\"Animals\" Icon=\"animals.png\">\n        \u003CTab Title=\"Cats\">\n            \u003CShellContent Title=\"Domestic\" Route=\"domesticcats\"\n                          ContentTemplate=\"{DataTemplate views:DomesticCatsPage}\" \u002F>\n            \u003CShellContent Title=\"Wild\" Route=\"wildcats\"\n                          ContentTemplate=\"{DataTemplate views:WildCatsPage}\" \u002F>\n        \u003C\u002FTab>\n        \u003CTab Title=\"Dogs\" Icon=\"dogs.png\">\n            \u003CShellContent Route=\"dogs\" ContentTemplate=\"{DataTemplate views:DogsPage}\" \u002F>\n        \u003C\u002FTab>\n    \u003C\u002FFlyoutItem>\n\n    \u003CTabBar>\n        \u003CShellContent Title=\"Home\" Icon=\"home.png\" Route=\"home\"\n                      ContentTemplate=\"{DataTemplate views:HomePage}\" \u002F>\n        \u003CShellContent Title=\"Settings\" Icon=\"settings.png\" Route=\"settings\"\n                      ContentTemplate=\"{DataTemplate views:SettingsPage}\" \u002F>\n    \u003C\u002FTabBar>\n\u003C\u002FShell>\n","xml",[974],{"type":43,"tag":80,"props":975,"children":976},{"__ignoreMap":591},[977,988,997,1006,1015,1024,1034,1043,1052,1061,1070,1079,1088,1097,1106,1115,1123,1132,1140,1149,1158,1167,1176,1185,1194],{"type":43,"tag":978,"props":979,"children":982},"span",{"class":980,"line":981},"line",1,[983],{"type":43,"tag":978,"props":984,"children":985},{},[986],{"type":49,"value":987},"\u003CShell xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n",{"type":43,"tag":978,"props":989,"children":991},{"class":980,"line":990},2,[992],{"type":43,"tag":978,"props":993,"children":994},{},[995],{"type":49,"value":996},"       xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n",{"type":43,"tag":978,"props":998,"children":1000},{"class":980,"line":999},3,[1001],{"type":43,"tag":978,"props":1002,"children":1003},{},[1004],{"type":49,"value":1005},"       xmlns:views=\"clr-namespace:MyApp.Views\"\n",{"type":43,"tag":978,"props":1007,"children":1009},{"class":980,"line":1008},4,[1010],{"type":43,"tag":978,"props":1011,"children":1012},{},[1013],{"type":49,"value":1014},"       x:Class=\"MyApp.AppShell\"\n",{"type":43,"tag":978,"props":1016,"children":1018},{"class":980,"line":1017},5,[1019],{"type":43,"tag":978,"props":1020,"children":1021},{},[1022],{"type":49,"value":1023},"       FlyoutBehavior=\"Flyout\">\n",{"type":43,"tag":978,"props":1025,"children":1027},{"class":980,"line":1026},6,[1028],{"type":43,"tag":978,"props":1029,"children":1031},{"emptyLinePlaceholder":1030},true,[1032],{"type":49,"value":1033},"\n",{"type":43,"tag":978,"props":1035,"children":1037},{"class":980,"line":1036},7,[1038],{"type":43,"tag":978,"props":1039,"children":1040},{},[1041],{"type":49,"value":1042},"    \u003CFlyoutItem Title=\"Animals\" Icon=\"animals.png\">\n",{"type":43,"tag":978,"props":1044,"children":1046},{"class":980,"line":1045},8,[1047],{"type":43,"tag":978,"props":1048,"children":1049},{},[1050],{"type":49,"value":1051},"        \u003CTab Title=\"Cats\">\n",{"type":43,"tag":978,"props":1053,"children":1055},{"class":980,"line":1054},9,[1056],{"type":43,"tag":978,"props":1057,"children":1058},{},[1059],{"type":49,"value":1060},"            \u003CShellContent Title=\"Domestic\" Route=\"domesticcats\"\n",{"type":43,"tag":978,"props":1062,"children":1064},{"class":980,"line":1063},10,[1065],{"type":43,"tag":978,"props":1066,"children":1067},{},[1068],{"type":49,"value":1069},"                          ContentTemplate=\"{DataTemplate views:DomesticCatsPage}\" \u002F>\n",{"type":43,"tag":978,"props":1071,"children":1073},{"class":980,"line":1072},11,[1074],{"type":43,"tag":978,"props":1075,"children":1076},{},[1077],{"type":49,"value":1078},"            \u003CShellContent Title=\"Wild\" Route=\"wildcats\"\n",{"type":43,"tag":978,"props":1080,"children":1082},{"class":980,"line":1081},12,[1083],{"type":43,"tag":978,"props":1084,"children":1085},{},[1086],{"type":49,"value":1087},"                          ContentTemplate=\"{DataTemplate views:WildCatsPage}\" \u002F>\n",{"type":43,"tag":978,"props":1089,"children":1091},{"class":980,"line":1090},13,[1092],{"type":43,"tag":978,"props":1093,"children":1094},{},[1095],{"type":49,"value":1096},"        \u003C\u002FTab>\n",{"type":43,"tag":978,"props":1098,"children":1100},{"class":980,"line":1099},14,[1101],{"type":43,"tag":978,"props":1102,"children":1103},{},[1104],{"type":49,"value":1105},"        \u003CTab Title=\"Dogs\" Icon=\"dogs.png\">\n",{"type":43,"tag":978,"props":1107,"children":1109},{"class":980,"line":1108},15,[1110],{"type":43,"tag":978,"props":1111,"children":1112},{},[1113],{"type":49,"value":1114},"            \u003CShellContent Route=\"dogs\" ContentTemplate=\"{DataTemplate views:DogsPage}\" \u002F>\n",{"type":43,"tag":978,"props":1116,"children":1118},{"class":980,"line":1117},16,[1119],{"type":43,"tag":978,"props":1120,"children":1121},{},[1122],{"type":49,"value":1096},{"type":43,"tag":978,"props":1124,"children":1126},{"class":980,"line":1125},17,[1127],{"type":43,"tag":978,"props":1128,"children":1129},{},[1130],{"type":49,"value":1131},"    \u003C\u002FFlyoutItem>\n",{"type":43,"tag":978,"props":1133,"children":1135},{"class":980,"line":1134},18,[1136],{"type":43,"tag":978,"props":1137,"children":1138},{"emptyLinePlaceholder":1030},[1139],{"type":49,"value":1033},{"type":43,"tag":978,"props":1141,"children":1143},{"class":980,"line":1142},19,[1144],{"type":43,"tag":978,"props":1145,"children":1146},{},[1147],{"type":49,"value":1148},"    \u003CTabBar>\n",{"type":43,"tag":978,"props":1150,"children":1152},{"class":980,"line":1151},20,[1153],{"type":43,"tag":978,"props":1154,"children":1155},{},[1156],{"type":49,"value":1157},"        \u003CShellContent Title=\"Home\" Icon=\"home.png\" Route=\"home\"\n",{"type":43,"tag":978,"props":1159,"children":1161},{"class":980,"line":1160},21,[1162],{"type":43,"tag":978,"props":1163,"children":1164},{},[1165],{"type":49,"value":1166},"                      ContentTemplate=\"{DataTemplate views:HomePage}\" \u002F>\n",{"type":43,"tag":978,"props":1168,"children":1170},{"class":980,"line":1169},22,[1171],{"type":43,"tag":978,"props":1172,"children":1173},{},[1174],{"type":49,"value":1175},"        \u003CShellContent Title=\"Settings\" Icon=\"settings.png\" Route=\"settings\"\n",{"type":43,"tag":978,"props":1177,"children":1179},{"class":980,"line":1178},23,[1180],{"type":43,"tag":978,"props":1181,"children":1182},{},[1183],{"type":49,"value":1184},"                      ContentTemplate=\"{DataTemplate views:SettingsPage}\" \u002F>\n",{"type":43,"tag":978,"props":1186,"children":1188},{"class":980,"line":1187},24,[1189],{"type":43,"tag":978,"props":1190,"children":1191},{},[1192],{"type":49,"value":1193},"    \u003C\u002FTabBar>\n",{"type":43,"tag":978,"props":1195,"children":1197},{"class":980,"line":1196},25,[1198],{"type":43,"tag":978,"props":1199,"children":1200},{},[1201],{"type":49,"value":1202},"\u003C\u002FShell>\n",{"type":43,"tag":583,"props":1204,"children":1208},{"className":1205,"code":1206,"language":1207,"meta":591,"style":591},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F AppShell.xaml.cs\npublic partial class AppShell : Shell\n{\n    public AppShell()\n    {\n        InitializeComponent();\n        Routing.RegisterRoute(\"animaldetails\", typeof(AnimalDetailsPage));\n        Routing.RegisterRoute(\"editanimal\", typeof(EditAnimalPage));\n    }\n}\n","csharp",[1209],{"type":43,"tag":80,"props":1210,"children":1211},{"__ignoreMap":591},[1212,1220,1228,1236,1244,1252,1260,1268,1276,1284],{"type":43,"tag":978,"props":1213,"children":1214},{"class":980,"line":981},[1215],{"type":43,"tag":978,"props":1216,"children":1217},{},[1218],{"type":49,"value":1219},"\u002F\u002F AppShell.xaml.cs\n",{"type":43,"tag":978,"props":1221,"children":1222},{"class":980,"line":990},[1223],{"type":43,"tag":978,"props":1224,"children":1225},{},[1226],{"type":49,"value":1227},"public partial class AppShell : Shell\n",{"type":43,"tag":978,"props":1229,"children":1230},{"class":980,"line":999},[1231],{"type":43,"tag":978,"props":1232,"children":1233},{},[1234],{"type":49,"value":1235},"{\n",{"type":43,"tag":978,"props":1237,"children":1238},{"class":980,"line":1008},[1239],{"type":43,"tag":978,"props":1240,"children":1241},{},[1242],{"type":49,"value":1243},"    public AppShell()\n",{"type":43,"tag":978,"props":1245,"children":1246},{"class":980,"line":1017},[1247],{"type":43,"tag":978,"props":1248,"children":1249},{},[1250],{"type":49,"value":1251},"    {\n",{"type":43,"tag":978,"props":1253,"children":1254},{"class":980,"line":1026},[1255],{"type":43,"tag":978,"props":1256,"children":1257},{},[1258],{"type":49,"value":1259},"        InitializeComponent();\n",{"type":43,"tag":978,"props":1261,"children":1262},{"class":980,"line":1036},[1263],{"type":43,"tag":978,"props":1264,"children":1265},{},[1266],{"type":49,"value":1267},"        Routing.RegisterRoute(\"animaldetails\", typeof(AnimalDetailsPage));\n",{"type":43,"tag":978,"props":1269,"children":1270},{"class":980,"line":1045},[1271],{"type":43,"tag":978,"props":1272,"children":1273},{},[1274],{"type":49,"value":1275},"        Routing.RegisterRoute(\"editanimal\", typeof(EditAnimalPage));\n",{"type":43,"tag":978,"props":1277,"children":1278},{"class":980,"line":1054},[1279],{"type":43,"tag":978,"props":1280,"children":1281},{},[1282],{"type":49,"value":1283},"    }\n",{"type":43,"tag":978,"props":1285,"children":1286},{"class":980,"line":1063},[1287],{"type":43,"tag":978,"props":1288,"children":1289},{},[1290],{"type":49,"value":1291},"}\n",{"type":43,"tag":58,"props":1293,"children":1295},{"id":1294},"workflow-navigate-with-gotoasync",[1296],{"type":49,"value":1297},"Workflow: Navigate with GoToAsync",{"type":43,"tag":52,"props":1299,"children":1300},{},[1301,1303,1309,1311,1316],{"type":49,"value":1302},"All programmatic navigation uses ",{"type":43,"tag":80,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":49,"value":1308},"Shell.Current.GoToAsync",{"type":49,"value":1310},". Always ",{"type":43,"tag":80,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":49,"value":409},{"type":49,"value":1317}," the call.",{"type":43,"tag":657,"props":1319,"children":1321},{"id":1320},"route-prefixes",[1322],{"type":49,"value":1323},"Route Prefixes",{"type":43,"tag":216,"props":1325,"children":1326},{},[1327,1343],{"type":43,"tag":220,"props":1328,"children":1329},{},[1330],{"type":43,"tag":224,"props":1331,"children":1332},{},[1333,1338],{"type":43,"tag":228,"props":1334,"children":1335},{},[1336],{"type":49,"value":1337},"Prefix",{"type":43,"tag":228,"props":1339,"children":1340},{},[1341],{"type":49,"value":1342},"Meaning",{"type":43,"tag":244,"props":1344,"children":1345},{},[1346,1363,1376,1393],{"type":43,"tag":224,"props":1347,"children":1348},{},[1349,1358],{"type":43,"tag":251,"props":1350,"children":1351},{},[1352],{"type":43,"tag":80,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":49,"value":1357},"\u002F\u002F",{"type":43,"tag":251,"props":1359,"children":1360},{},[1361],{"type":49,"value":1362},"Absolute route from Shell root",{"type":43,"tag":224,"props":1364,"children":1365},{},[1366,1371],{"type":43,"tag":251,"props":1367,"children":1368},{},[1369],{"type":49,"value":1370},"(none)",{"type":43,"tag":251,"props":1372,"children":1373},{},[1374],{"type":49,"value":1375},"Relative; pushes onto the current nav stack",{"type":43,"tag":224,"props":1377,"children":1378},{},[1379,1388],{"type":43,"tag":251,"props":1380,"children":1381},{},[1382],{"type":43,"tag":80,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":49,"value":1387},"..",{"type":43,"tag":251,"props":1389,"children":1390},{},[1391],{"type":49,"value":1392},"Go back one level",{"type":43,"tag":224,"props":1394,"children":1395},{},[1396,1405],{"type":43,"tag":251,"props":1397,"children":1398},{},[1399],{"type":43,"tag":80,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":49,"value":1404},"..\u002F",{"type":43,"tag":251,"props":1406,"children":1407},{},[1408],{"type":49,"value":1409},"Go back then navigate forward",{"type":43,"tag":657,"props":1411,"children":1413},{"id":1412},"navigation-examples",[1414],{"type":49,"value":1415},"Navigation Examples",{"type":43,"tag":583,"props":1417,"children":1419},{"className":1205,"code":1418,"language":1207,"meta":591,"style":591},"\u002F\u002F 1. Absolute — switch to a specific hierarchy location\nawait Shell.Current.GoToAsync(\"\u002F\u002Fanimals\u002Fcats\u002Fdomestic\");\n\n\u002F\u002F 2. Relative — push a registered detail page\nawait Shell.Current.GoToAsync(\"animaldetails\");\n\n\u002F\u002F 3. With query string parameters\nawait Shell.Current.GoToAsync($\"animaldetails?id={animal.Id}\");\n\n\u002F\u002F 4. Go back one page\nawait Shell.Current.GoToAsync(\"..\");\n\n\u002F\u002F 5. Go back two pages\nawait Shell.Current.GoToAsync(\"..\u002F..\");\n\n\u002F\u002F 6. Go back one page, then push a different page\nawait Shell.Current.GoToAsync(\"..\u002Feditanimal\");\n",[1420],{"type":43,"tag":80,"props":1421,"children":1422},{"__ignoreMap":591},[1423,1431,1439,1446,1454,1462,1469,1477,1485,1492,1500,1508,1515,1523,1531,1538,1546],{"type":43,"tag":978,"props":1424,"children":1425},{"class":980,"line":981},[1426],{"type":43,"tag":978,"props":1427,"children":1428},{},[1429],{"type":49,"value":1430},"\u002F\u002F 1. Absolute — switch to a specific hierarchy location\n",{"type":43,"tag":978,"props":1432,"children":1433},{"class":980,"line":990},[1434],{"type":43,"tag":978,"props":1435,"children":1436},{},[1437],{"type":49,"value":1438},"await Shell.Current.GoToAsync(\"\u002F\u002Fanimals\u002Fcats\u002Fdomestic\");\n",{"type":43,"tag":978,"props":1440,"children":1441},{"class":980,"line":999},[1442],{"type":43,"tag":978,"props":1443,"children":1444},{"emptyLinePlaceholder":1030},[1445],{"type":49,"value":1033},{"type":43,"tag":978,"props":1447,"children":1448},{"class":980,"line":1008},[1449],{"type":43,"tag":978,"props":1450,"children":1451},{},[1452],{"type":49,"value":1453},"\u002F\u002F 2. Relative — push a registered detail page\n",{"type":43,"tag":978,"props":1455,"children":1456},{"class":980,"line":1017},[1457],{"type":43,"tag":978,"props":1458,"children":1459},{},[1460],{"type":49,"value":1461},"await Shell.Current.GoToAsync(\"animaldetails\");\n",{"type":43,"tag":978,"props":1463,"children":1464},{"class":980,"line":1026},[1465],{"type":43,"tag":978,"props":1466,"children":1467},{"emptyLinePlaceholder":1030},[1468],{"type":49,"value":1033},{"type":43,"tag":978,"props":1470,"children":1471},{"class":980,"line":1036},[1472],{"type":43,"tag":978,"props":1473,"children":1474},{},[1475],{"type":49,"value":1476},"\u002F\u002F 3. With query string parameters\n",{"type":43,"tag":978,"props":1478,"children":1479},{"class":980,"line":1045},[1480],{"type":43,"tag":978,"props":1481,"children":1482},{},[1483],{"type":49,"value":1484},"await Shell.Current.GoToAsync($\"animaldetails?id={animal.Id}\");\n",{"type":43,"tag":978,"props":1486,"children":1487},{"class":980,"line":1054},[1488],{"type":43,"tag":978,"props":1489,"children":1490},{"emptyLinePlaceholder":1030},[1491],{"type":49,"value":1033},{"type":43,"tag":978,"props":1493,"children":1494},{"class":980,"line":1063},[1495],{"type":43,"tag":978,"props":1496,"children":1497},{},[1498],{"type":49,"value":1499},"\u002F\u002F 4. Go back one page\n",{"type":43,"tag":978,"props":1501,"children":1502},{"class":980,"line":1072},[1503],{"type":43,"tag":978,"props":1504,"children":1505},{},[1506],{"type":49,"value":1507},"await Shell.Current.GoToAsync(\"..\");\n",{"type":43,"tag":978,"props":1509,"children":1510},{"class":980,"line":1081},[1511],{"type":43,"tag":978,"props":1512,"children":1513},{"emptyLinePlaceholder":1030},[1514],{"type":49,"value":1033},{"type":43,"tag":978,"props":1516,"children":1517},{"class":980,"line":1090},[1518],{"type":43,"tag":978,"props":1519,"children":1520},{},[1521],{"type":49,"value":1522},"\u002F\u002F 5. Go back two pages\n",{"type":43,"tag":978,"props":1524,"children":1525},{"class":980,"line":1099},[1526],{"type":43,"tag":978,"props":1527,"children":1528},{},[1529],{"type":49,"value":1530},"await Shell.Current.GoToAsync(\"..\u002F..\");\n",{"type":43,"tag":978,"props":1532,"children":1533},{"class":980,"line":1108},[1534],{"type":43,"tag":978,"props":1535,"children":1536},{"emptyLinePlaceholder":1030},[1537],{"type":49,"value":1033},{"type":43,"tag":978,"props":1539,"children":1540},{"class":980,"line":1117},[1541],{"type":43,"tag":978,"props":1542,"children":1543},{},[1544],{"type":49,"value":1545},"\u002F\u002F 6. Go back one page, then push a different page\n",{"type":43,"tag":978,"props":1547,"children":1548},{"class":980,"line":1125},[1549],{"type":43,"tag":978,"props":1550,"children":1551},{},[1552],{"type":49,"value":1553},"await Shell.Current.GoToAsync(\"..\u002Feditanimal\");\n",{"type":43,"tag":58,"props":1555,"children":1557},{"id":1556},"workflow-pass-data-between-pages",[1558],{"type":49,"value":1559},"Workflow: Pass Data Between Pages",{"type":43,"tag":657,"props":1561,"children":1563},{"id":1562},"option-1-iqueryattributable-preferred",[1564],{"type":49,"value":1565},"Option 1: IQueryAttributable (Preferred)",{"type":43,"tag":52,"props":1567,"children":1568},{},[1569],{"type":49,"value":1570},"Implement on ViewModels to receive all parameters in one call:",{"type":43,"tag":583,"props":1572,"children":1574},{"className":1205,"code":1573,"language":1207,"meta":591,"style":591},"public class AnimalDetailsViewModel : ObservableObject, IQueryAttributable\n{\n    public void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n    {\n        if (query.TryGetValue(\"id\", out var id))\n            AnimalId = id.ToString();\n    }\n}\n",[1575],{"type":43,"tag":80,"props":1576,"children":1577},{"__ignoreMap":591},[1578,1586,1593,1601,1608,1616,1624,1631],{"type":43,"tag":978,"props":1579,"children":1580},{"class":980,"line":981},[1581],{"type":43,"tag":978,"props":1582,"children":1583},{},[1584],{"type":49,"value":1585},"public class AnimalDetailsViewModel : ObservableObject, IQueryAttributable\n",{"type":43,"tag":978,"props":1587,"children":1588},{"class":980,"line":990},[1589],{"type":43,"tag":978,"props":1590,"children":1591},{},[1592],{"type":49,"value":1235},{"type":43,"tag":978,"props":1594,"children":1595},{"class":980,"line":999},[1596],{"type":43,"tag":978,"props":1597,"children":1598},{},[1599],{"type":49,"value":1600},"    public void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n",{"type":43,"tag":978,"props":1602,"children":1603},{"class":980,"line":1008},[1604],{"type":43,"tag":978,"props":1605,"children":1606},{},[1607],{"type":49,"value":1251},{"type":43,"tag":978,"props":1609,"children":1610},{"class":980,"line":1017},[1611],{"type":43,"tag":978,"props":1612,"children":1613},{},[1614],{"type":49,"value":1615},"        if (query.TryGetValue(\"id\", out var id))\n",{"type":43,"tag":978,"props":1617,"children":1618},{"class":980,"line":1026},[1619],{"type":43,"tag":978,"props":1620,"children":1621},{},[1622],{"type":49,"value":1623},"            AnimalId = id.ToString();\n",{"type":43,"tag":978,"props":1625,"children":1626},{"class":980,"line":1036},[1627],{"type":43,"tag":978,"props":1628,"children":1629},{},[1630],{"type":49,"value":1283},{"type":43,"tag":978,"props":1632,"children":1633},{"class":980,"line":1045},[1634],{"type":43,"tag":978,"props":1635,"children":1636},{},[1637],{"type":49,"value":1291},{"type":43,"tag":657,"props":1639,"children":1641},{"id":1640},"option-2-queryproperty-attribute",[1642],{"type":49,"value":1643},"Option 2: QueryProperty Attribute",{"type":43,"tag":52,"props":1645,"children":1646},{},[1647,1649,1653,1655,1660,1662,1668],{"type":49,"value":1648},"Apply on the ",{"type":43,"tag":294,"props":1650,"children":1651},{},[1652],{"type":49,"value":358},{"type":49,"value":1654}," class (or the page, if it genuinely owns the state).\nPrefer ",{"type":43,"tag":80,"props":1656,"children":1658},{"className":1657},[],[1659],{"type":49,"value":351},{"type":49,"value":1661}," on the ViewModel — it keeps navigation state with the\n",{"type":43,"tag":80,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":49,"value":1667},"BindingContext",{"type":49,"value":1669}," and handles multiple parameters in one call:",{"type":43,"tag":583,"props":1671,"children":1673},{"className":1205,"code":1672,"language":1207,"meta":591,"style":591},"[QueryProperty(nameof(AnimalId), \"id\")]\npublic partial class AnimalDetailsViewModel : ObservableObject\n{\n    [ObservableProperty]\n    private string _animalId = string.Empty;\n}\n",[1674],{"type":43,"tag":80,"props":1675,"children":1676},{"__ignoreMap":591},[1677,1685,1693,1700,1708,1716],{"type":43,"tag":978,"props":1678,"children":1679},{"class":980,"line":981},[1680],{"type":43,"tag":978,"props":1681,"children":1682},{},[1683],{"type":49,"value":1684},"[QueryProperty(nameof(AnimalId), \"id\")]\n",{"type":43,"tag":978,"props":1686,"children":1687},{"class":980,"line":990},[1688],{"type":43,"tag":978,"props":1689,"children":1690},{},[1691],{"type":49,"value":1692},"public partial class AnimalDetailsViewModel : ObservableObject\n",{"type":43,"tag":978,"props":1694,"children":1695},{"class":980,"line":999},[1696],{"type":43,"tag":978,"props":1697,"children":1698},{},[1699],{"type":49,"value":1235},{"type":43,"tag":978,"props":1701,"children":1702},{"class":980,"line":1008},[1703],{"type":43,"tag":978,"props":1704,"children":1705},{},[1706],{"type":49,"value":1707},"    [ObservableProperty]\n",{"type":43,"tag":978,"props":1709,"children":1710},{"class":980,"line":1017},[1711],{"type":43,"tag":978,"props":1712,"children":1713},{},[1714],{"type":49,"value":1715},"    private string _animalId = string.Empty;\n",{"type":43,"tag":978,"props":1717,"children":1718},{"class":980,"line":1026},[1719],{"type":43,"tag":978,"props":1720,"children":1721},{},[1722],{"type":49,"value":1291},{"type":43,"tag":52,"props":1724,"children":1725},{},[1726,1728,1733,1735,1740],{"type":49,"value":1727},"Shell applies query attributes ",{"type":43,"tag":522,"props":1729,"children":1730},{},[1731],{"type":49,"value":1732},"after",{"type":49,"value":1734}," the page constructor sets ",{"type":43,"tag":80,"props":1736,"children":1738},{"className":1737},[],[1739],{"type":49,"value":1667},{"type":49,"value":1741},",\nso the property must raise change notification — a plain auto-property leaves the\nbinding stuck on its initial value.",{"type":43,"tag":657,"props":1743,"children":1745},{"id":1744},"option-3-complex-objects-via-shellnavigationqueryparameters",[1746],{"type":49,"value":1747},"Option 3: Complex Objects via ShellNavigationQueryParameters",{"type":43,"tag":52,"props":1749,"children":1750},{},[1751],{"type":49,"value":1752},"Pass objects without serializing to strings:",{"type":43,"tag":583,"props":1754,"children":1756},{"className":1205,"code":1755,"language":1207,"meta":591,"style":591},"var parameters = new ShellNavigationQueryParameters\n{\n    { \"animal\", selectedAnimal }\n};\nawait Shell.Current.GoToAsync(\"animaldetails\", parameters);\n",[1757],{"type":43,"tag":80,"props":1758,"children":1759},{"__ignoreMap":591},[1760,1768,1775,1783,1791],{"type":43,"tag":978,"props":1761,"children":1762},{"class":980,"line":981},[1763],{"type":43,"tag":978,"props":1764,"children":1765},{},[1766],{"type":49,"value":1767},"var parameters = new ShellNavigationQueryParameters\n",{"type":43,"tag":978,"props":1769,"children":1770},{"class":980,"line":990},[1771],{"type":43,"tag":978,"props":1772,"children":1773},{},[1774],{"type":49,"value":1235},{"type":43,"tag":978,"props":1776,"children":1777},{"class":980,"line":999},[1778],{"type":43,"tag":978,"props":1779,"children":1780},{},[1781],{"type":49,"value":1782},"    { \"animal\", selectedAnimal }\n",{"type":43,"tag":978,"props":1784,"children":1785},{"class":980,"line":1008},[1786],{"type":43,"tag":978,"props":1787,"children":1788},{},[1789],{"type":49,"value":1790},"};\n",{"type":43,"tag":978,"props":1792,"children":1793},{"class":980,"line":1017},[1794],{"type":43,"tag":978,"props":1795,"children":1796},{},[1797],{"type":49,"value":1798},"await Shell.Current.GoToAsync(\"animaldetails\", parameters);\n",{"type":43,"tag":52,"props":1800,"children":1801},{},[1802,1804,1809],{"type":49,"value":1803},"Receive via ",{"type":43,"tag":80,"props":1805,"children":1807},{"className":1806},[],[1808],{"type":49,"value":351},{"type":49,"value":1810},":",{"type":43,"tag":583,"props":1812,"children":1814},{"className":1205,"code":1813,"language":1207,"meta":591,"style":591},"public void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n{\n    Animal = query[\"animal\"] as Animal;\n}\n",[1815],{"type":43,"tag":80,"props":1816,"children":1817},{"__ignoreMap":591},[1818,1826,1833,1841],{"type":43,"tag":978,"props":1819,"children":1820},{"class":980,"line":981},[1821],{"type":43,"tag":978,"props":1822,"children":1823},{},[1824],{"type":49,"value":1825},"public void ApplyQueryAttributes(IDictionary\u003Cstring, object> query)\n",{"type":43,"tag":978,"props":1827,"children":1828},{"class":980,"line":990},[1829],{"type":43,"tag":978,"props":1830,"children":1831},{},[1832],{"type":49,"value":1235},{"type":43,"tag":978,"props":1834,"children":1835},{"class":980,"line":999},[1836],{"type":43,"tag":978,"props":1837,"children":1838},{},[1839],{"type":49,"value":1840},"    Animal = query[\"animal\"] as Animal;\n",{"type":43,"tag":978,"props":1842,"children":1843},{"class":980,"line":1008},[1844],{"type":43,"tag":978,"props":1845,"children":1846},{},[1847],{"type":49,"value":1291},{"type":43,"tag":58,"props":1849,"children":1851},{"id":1850},"workflow-guard-navigation",[1852],{"type":49,"value":1853},"Workflow: Guard Navigation",{"type":43,"tag":52,"props":1855,"children":1856},{},[1857,1859,1865,1866,1872],{"type":49,"value":1858},"Use ",{"type":43,"tag":80,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":49,"value":1864},"GetDeferral()",{"type":49,"value":745},{"type":43,"tag":80,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":49,"value":1871},"OnNavigating",{"type":49,"value":1873}," for async checks (e.g., \"save unsaved changes?\"):",{"type":43,"tag":583,"props":1875,"children":1877},{"className":1205,"code":1876,"language":1207,"meta":591,"style":591},"\u002F\u002F In AppShell.xaml.cs\nprotected override async void OnNavigating(ShellNavigatingEventArgs args)\n{\n    base.OnNavigating(args);\n    if (hasUnsavedChanges && args.Source == ShellNavigationSource.Pop)\n    {\n        var deferral = args.GetDeferral();\n        bool discard = await ShowConfirmationDialog();\n        if (!discard)\n            args.Cancel();\n        deferral.Complete();\n    }\n}\n",[1878],{"type":43,"tag":80,"props":1879,"children":1880},{"__ignoreMap":591},[1881,1889,1897,1904,1912,1920,1927,1935,1943,1951,1959,1967,1974],{"type":43,"tag":978,"props":1882,"children":1883},{"class":980,"line":981},[1884],{"type":43,"tag":978,"props":1885,"children":1886},{},[1887],{"type":49,"value":1888},"\u002F\u002F In AppShell.xaml.cs\n",{"type":43,"tag":978,"props":1890,"children":1891},{"class":980,"line":990},[1892],{"type":43,"tag":978,"props":1893,"children":1894},{},[1895],{"type":49,"value":1896},"protected override async void OnNavigating(ShellNavigatingEventArgs args)\n",{"type":43,"tag":978,"props":1898,"children":1899},{"class":980,"line":999},[1900],{"type":43,"tag":978,"props":1901,"children":1902},{},[1903],{"type":49,"value":1235},{"type":43,"tag":978,"props":1905,"children":1906},{"class":980,"line":1008},[1907],{"type":43,"tag":978,"props":1908,"children":1909},{},[1910],{"type":49,"value":1911},"    base.OnNavigating(args);\n",{"type":43,"tag":978,"props":1913,"children":1914},{"class":980,"line":1017},[1915],{"type":43,"tag":978,"props":1916,"children":1917},{},[1918],{"type":49,"value":1919},"    if (hasUnsavedChanges && args.Source == ShellNavigationSource.Pop)\n",{"type":43,"tag":978,"props":1921,"children":1922},{"class":980,"line":1026},[1923],{"type":43,"tag":978,"props":1924,"children":1925},{},[1926],{"type":49,"value":1251},{"type":43,"tag":978,"props":1928,"children":1929},{"class":980,"line":1036},[1930],{"type":43,"tag":978,"props":1931,"children":1932},{},[1933],{"type":49,"value":1934},"        var deferral = args.GetDeferral();\n",{"type":43,"tag":978,"props":1936,"children":1937},{"class":980,"line":1045},[1938],{"type":43,"tag":978,"props":1939,"children":1940},{},[1941],{"type":49,"value":1942},"        bool discard = await ShowConfirmationDialog();\n",{"type":43,"tag":978,"props":1944,"children":1945},{"class":980,"line":1054},[1946],{"type":43,"tag":978,"props":1947,"children":1948},{},[1949],{"type":49,"value":1950},"        if (!discard)\n",{"type":43,"tag":978,"props":1952,"children":1953},{"class":980,"line":1063},[1954],{"type":43,"tag":978,"props":1955,"children":1956},{},[1957],{"type":49,"value":1958},"            args.Cancel();\n",{"type":43,"tag":978,"props":1960,"children":1961},{"class":980,"line":1072},[1962],{"type":43,"tag":978,"props":1963,"children":1964},{},[1965],{"type":49,"value":1966},"        deferral.Complete();\n",{"type":43,"tag":978,"props":1968,"children":1969},{"class":980,"line":1081},[1970],{"type":43,"tag":978,"props":1971,"children":1972},{},[1973],{"type":49,"value":1283},{"type":43,"tag":978,"props":1975,"children":1976},{"class":980,"line":1090},[1977],{"type":43,"tag":978,"props":1978,"children":1979},{},[1980],{"type":49,"value":1291},{"type":43,"tag":58,"props":1982,"children":1984},{"id":1983},"tab-configuration",[1985],{"type":49,"value":1986},"Tab Configuration",{"type":43,"tag":657,"props":1988,"children":1990},{"id":1989},"bottom-tabs",[1991],{"type":49,"value":1992},"Bottom Tabs",{"type":43,"tag":52,"props":1994,"children":1995},{},[1996,1998,2003,2005,2010,2012,2017,2018,2023],{"type":49,"value":1997},"Multiple ",{"type":43,"tag":80,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":49,"value":639},{"type":49,"value":2004}," (or ",{"type":43,"tag":80,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":49,"value":612},{"type":49,"value":2011},") children inside a ",{"type":43,"tag":80,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":49,"value":622},{"type":49,"value":799},{"type":43,"tag":80,"props":2019,"children":2021},{"className":2020},[],[2022],{"type":49,"value":604},{"type":49,"value":2024}," produce bottom tabs.",{"type":43,"tag":657,"props":2026,"children":2028},{"id":2027},"top-tabs",[2029],{"type":49,"value":2030},"Top Tabs",{"type":43,"tag":52,"props":2032,"children":2033},{},[2034,2035,2040,2042,2047],{"type":49,"value":1997},{"type":43,"tag":80,"props":2036,"children":2038},{"className":2037},[],[2039],{"type":49,"value":639},{"type":49,"value":2041}," children inside a single ",{"type":43,"tag":80,"props":2043,"children":2045},{"className":2044},[],[2046],{"type":49,"value":612},{"type":49,"value":2048}," produce top tabs:",{"type":43,"tag":583,"props":2050,"children":2052},{"className":970,"code":2051,"language":972,"meta":591,"style":591},"\u003CTab Title=\"Photos\">\n    \u003CShellContent Title=\"Recent\"    ContentTemplate=\"{DataTemplate views:RecentPage}\" \u002F>\n    \u003CShellContent Title=\"Favorites\" ContentTemplate=\"{DataTemplate views:FavoritesPage}\" \u002F>\n\u003C\u002FTab>\n",[2053],{"type":43,"tag":80,"props":2054,"children":2055},{"__ignoreMap":591},[2056,2064,2072,2080],{"type":43,"tag":978,"props":2057,"children":2058},{"class":980,"line":981},[2059],{"type":43,"tag":978,"props":2060,"children":2061},{},[2062],{"type":49,"value":2063},"\u003CTab Title=\"Photos\">\n",{"type":43,"tag":978,"props":2065,"children":2066},{"class":980,"line":990},[2067],{"type":43,"tag":978,"props":2068,"children":2069},{},[2070],{"type":49,"value":2071},"    \u003CShellContent Title=\"Recent\"    ContentTemplate=\"{DataTemplate views:RecentPage}\" \u002F>\n",{"type":43,"tag":978,"props":2073,"children":2074},{"class":980,"line":999},[2075],{"type":43,"tag":978,"props":2076,"children":2077},{},[2078],{"type":49,"value":2079},"    \u003CShellContent Title=\"Favorites\" ContentTemplate=\"{DataTemplate views:FavoritesPage}\" \u002F>\n",{"type":43,"tag":978,"props":2081,"children":2082},{"class":980,"line":1008},[2083],{"type":43,"tag":978,"props":2084,"children":2085},{},[2086],{"type":49,"value":2087},"\u003C\u002FTab>\n",{"type":43,"tag":657,"props":2089,"children":2091},{"id":2090},"tab-bar-appearance",[2092],{"type":49,"value":2093},"Tab Bar Appearance",{"type":43,"tag":216,"props":2095,"children":2096},{},[2097,2118],{"type":43,"tag":220,"props":2098,"children":2099},{},[2100],{"type":43,"tag":224,"props":2101,"children":2102},{},[2103,2108,2113],{"type":43,"tag":228,"props":2104,"children":2105},{},[2106],{"type":49,"value":2107},"Attached Property",{"type":43,"tag":228,"props":2109,"children":2110},{},[2111],{"type":49,"value":2112},"Type",{"type":43,"tag":228,"props":2114,"children":2115},{},[2116],{"type":49,"value":2117},"Purpose",{"type":43,"tag":244,"props":2119,"children":2120},{},[2121,2147,2172,2197,2222],{"type":43,"tag":224,"props":2122,"children":2123},{},[2124,2133,2142],{"type":43,"tag":251,"props":2125,"children":2126},{},[2127],{"type":43,"tag":80,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":49,"value":2132},"Shell.TabBarBackgroundColor",{"type":43,"tag":251,"props":2134,"children":2135},{},[2136],{"type":43,"tag":80,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":49,"value":2141},"Color",{"type":43,"tag":251,"props":2143,"children":2144},{},[2145],{"type":49,"value":2146},"Tab bar background",{"type":43,"tag":224,"props":2148,"children":2149},{},[2150,2159,2167],{"type":43,"tag":251,"props":2151,"children":2152},{},[2153],{"type":43,"tag":80,"props":2154,"children":2156},{"className":2155},[],[2157],{"type":49,"value":2158},"Shell.TabBarForegroundColor",{"type":43,"tag":251,"props":2160,"children":2161},{},[2162],{"type":43,"tag":80,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":49,"value":2141},{"type":43,"tag":251,"props":2168,"children":2169},{},[2170],{"type":49,"value":2171},"Selected icon color",{"type":43,"tag":224,"props":2173,"children":2174},{},[2175,2184,2192],{"type":43,"tag":251,"props":2176,"children":2177},{},[2178],{"type":43,"tag":80,"props":2179,"children":2181},{"className":2180},[],[2182],{"type":49,"value":2183},"Shell.TabBarTitleColor",{"type":43,"tag":251,"props":2185,"children":2186},{},[2187],{"type":43,"tag":80,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":49,"value":2141},{"type":43,"tag":251,"props":2193,"children":2194},{},[2195],{"type":49,"value":2196},"Selected tab title color",{"type":43,"tag":224,"props":2198,"children":2199},{},[2200,2209,2217],{"type":43,"tag":251,"props":2201,"children":2202},{},[2203],{"type":43,"tag":80,"props":2204,"children":2206},{"className":2205},[],[2207],{"type":49,"value":2208},"Shell.TabBarUnselectedColor",{"type":43,"tag":251,"props":2210,"children":2211},{},[2212],{"type":43,"tag":80,"props":2213,"children":2215},{"className":2214},[],[2216],{"type":49,"value":2141},{"type":43,"tag":251,"props":2218,"children":2219},{},[2220],{"type":49,"value":2221},"Unselected tab icon\u002Ftitle",{"type":43,"tag":224,"props":2223,"children":2224},{},[2225,2234,2243],{"type":43,"tag":251,"props":2226,"children":2227},{},[2228],{"type":43,"tag":80,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":49,"value":2233},"Shell.TabBarIsVisible",{"type":43,"tag":251,"props":2235,"children":2236},{},[2237],{"type":43,"tag":80,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":49,"value":2242},"bool",{"type":43,"tag":251,"props":2244,"children":2245},{},[2246],{"type":49,"value":2247},"Show\u002Fhide the tab bar",{"type":43,"tag":583,"props":2249,"children":2251},{"className":970,"code":2250,"language":972,"meta":591,"style":591},"\u003C!-- Hide the tab bar on a specific page -->\n\u003CContentPage Shell.TabBarIsVisible=\"False\" ... \u002F>\n",[2252],{"type":43,"tag":80,"props":2253,"children":2254},{"__ignoreMap":591},[2255,2263],{"type":43,"tag":978,"props":2256,"children":2257},{"class":980,"line":981},[2258],{"type":43,"tag":978,"props":2259,"children":2260},{},[2261],{"type":49,"value":2262},"\u003C!-- Hide the tab bar on a specific page -->\n",{"type":43,"tag":978,"props":2264,"children":2265},{"class":980,"line":990},[2266],{"type":43,"tag":978,"props":2267,"children":2268},{},[2269],{"type":49,"value":2270},"\u003CContentPage Shell.TabBarIsVisible=\"False\" ... \u002F>\n",{"type":43,"tag":58,"props":2272,"children":2274},{"id":2273},"flyout-configuration",[2275],{"type":49,"value":2276},"Flyout Configuration",{"type":43,"tag":657,"props":2278,"children":2280},{"id":2279},"flyoutbehavior",[2281],{"type":49,"value":2282},"FlyoutBehavior",{"type":43,"tag":52,"props":2284,"children":2285},{},[2286,2288,2293,2295,2301,2303,2309,2311,2317],{"type":49,"value":2287},"Set on ",{"type":43,"tag":80,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":49,"value":787},{"type":49,"value":2294},": ",{"type":43,"tag":80,"props":2296,"children":2298},{"className":2297},[],[2299],{"type":49,"value":2300},"Disabled",{"type":49,"value":2302},", ",{"type":43,"tag":80,"props":2304,"children":2306},{"className":2305},[],[2307],{"type":49,"value":2308},"Flyout",{"type":49,"value":2310},", or ",{"type":43,"tag":80,"props":2312,"children":2314},{"className":2313},[],[2315],{"type":49,"value":2316},"Locked",{"type":49,"value":910},{"type":43,"tag":583,"props":2319,"children":2321},{"className":970,"code":2320,"language":972,"meta":591,"style":591},"\u003CShell FlyoutBehavior=\"Flyout\"> ... \u003C\u002FShell>\n",[2322],{"type":43,"tag":80,"props":2323,"children":2324},{"__ignoreMap":591},[2325],{"type":43,"tag":978,"props":2326,"children":2327},{"class":980,"line":981},[2328],{"type":43,"tag":978,"props":2329,"children":2330},{},[2331],{"type":49,"value":2320},{"type":43,"tag":657,"props":2333,"children":2335},{"id":2334},"flyoutdisplayoptions",[2336],{"type":49,"value":2337},"FlyoutDisplayOptions",{"type":43,"tag":52,"props":2339,"children":2340},{},[2341],{"type":49,"value":2342},"Controls how children appear in the flyout:",{"type":43,"tag":65,"props":2344,"children":2345},{},[2346,2357],{"type":43,"tag":69,"props":2347,"children":2348},{},[2349,2355],{"type":43,"tag":80,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":49,"value":2354},"AsSingleItem",{"type":49,"value":2356}," (default) — one flyout entry for the group",{"type":43,"tag":69,"props":2358,"children":2359},{},[2360,2366,2368,2373],{"type":43,"tag":80,"props":2361,"children":2363},{"className":2362},[],[2364],{"type":49,"value":2365},"AsMultipleItems",{"type":49,"value":2367}," — each child ",{"type":43,"tag":80,"props":2369,"children":2371},{"className":2370},[],[2372],{"type":49,"value":612},{"type":49,"value":2374}," gets its own entry",{"type":43,"tag":583,"props":2376,"children":2378},{"className":970,"code":2377,"language":972,"meta":591,"style":591},"\u003CFlyoutItem Title=\"Animals\" FlyoutDisplayOptions=\"AsMultipleItems\">\n    \u003CTab Title=\"Cats\" ... \u002F>\n    \u003CTab Title=\"Dogs\" ... \u002F>\n\u003C\u002FFlyoutItem>\n",[2379],{"type":43,"tag":80,"props":2380,"children":2381},{"__ignoreMap":591},[2382,2390,2398,2406],{"type":43,"tag":978,"props":2383,"children":2384},{"class":980,"line":981},[2385],{"type":43,"tag":978,"props":2386,"children":2387},{},[2388],{"type":49,"value":2389},"\u003CFlyoutItem Title=\"Animals\" FlyoutDisplayOptions=\"AsMultipleItems\">\n",{"type":43,"tag":978,"props":2391,"children":2392},{"class":980,"line":990},[2393],{"type":43,"tag":978,"props":2394,"children":2395},{},[2396],{"type":49,"value":2397},"    \u003CTab Title=\"Cats\" ... \u002F>\n",{"type":43,"tag":978,"props":2399,"children":2400},{"class":980,"line":999},[2401],{"type":43,"tag":978,"props":2402,"children":2403},{},[2404],{"type":49,"value":2405},"    \u003CTab Title=\"Dogs\" ... \u002F>\n",{"type":43,"tag":978,"props":2407,"children":2408},{"class":980,"line":1008},[2409],{"type":43,"tag":978,"props":2410,"children":2411},{},[2412],{"type":49,"value":2413},"\u003C\u002FFlyoutItem>\n",{"type":43,"tag":657,"props":2415,"children":2417},{"id":2416},"menuitem-non-navigation-flyout-entries",[2418],{"type":49,"value":2419},"MenuItem (Non-Navigation Flyout Entries)",{"type":43,"tag":583,"props":2421,"children":2423},{"className":970,"code":2422,"language":972,"meta":591,"style":591},"\u003CMenuItem Text=\"Log Out\"\n          Command=\"{Binding LogOutCommand}\"\n          IconImageSource=\"logout.png\" \u002F>\n",[2424],{"type":43,"tag":80,"props":2425,"children":2426},{"__ignoreMap":591},[2427,2435,2443],{"type":43,"tag":978,"props":2428,"children":2429},{"class":980,"line":981},[2430],{"type":43,"tag":978,"props":2431,"children":2432},{},[2433],{"type":49,"value":2434},"\u003CMenuItem Text=\"Log Out\"\n",{"type":43,"tag":978,"props":2436,"children":2437},{"class":980,"line":990},[2438],{"type":43,"tag":978,"props":2439,"children":2440},{},[2441],{"type":49,"value":2442},"          Command=\"{Binding LogOutCommand}\"\n",{"type":43,"tag":978,"props":2444,"children":2445},{"class":980,"line":999},[2446],{"type":43,"tag":978,"props":2447,"children":2448},{},[2449],{"type":49,"value":2450},"          IconImageSource=\"logout.png\" \u002F>\n",{"type":43,"tag":58,"props":2452,"children":2454},{"id":2453},"back-button-behavior",[2455],{"type":49,"value":2456},"Back Button Behavior",{"type":43,"tag":52,"props":2458,"children":2459},{},[2460],{"type":49,"value":2461},"Customize the back button per page:",{"type":43,"tag":583,"props":2463,"children":2465},{"className":970,"code":2464,"language":972,"meta":591,"style":591},"\u003CShell.BackButtonBehavior>\n    \u003CBackButtonBehavior Command=\"{Binding BackCommand}\"\n                       IconOverride=\"back_arrow.png\"\n                       TextOverride=\"Cancel\"\n                       IsVisible=\"True\" \u002F>\n\u003C\u002FShell.BackButtonBehavior>\n",[2466],{"type":43,"tag":80,"props":2467,"children":2468},{"__ignoreMap":591},[2469,2477,2485,2493,2501,2509],{"type":43,"tag":978,"props":2470,"children":2471},{"class":980,"line":981},[2472],{"type":43,"tag":978,"props":2473,"children":2474},{},[2475],{"type":49,"value":2476},"\u003CShell.BackButtonBehavior>\n",{"type":43,"tag":978,"props":2478,"children":2479},{"class":980,"line":990},[2480],{"type":43,"tag":978,"props":2481,"children":2482},{},[2483],{"type":49,"value":2484},"    \u003CBackButtonBehavior Command=\"{Binding BackCommand}\"\n",{"type":43,"tag":978,"props":2486,"children":2487},{"class":980,"line":999},[2488],{"type":43,"tag":978,"props":2489,"children":2490},{},[2491],{"type":49,"value":2492},"                       IconOverride=\"back_arrow.png\"\n",{"type":43,"tag":978,"props":2494,"children":2495},{"class":980,"line":1008},[2496],{"type":43,"tag":978,"props":2497,"children":2498},{},[2499],{"type":49,"value":2500},"                       TextOverride=\"Cancel\"\n",{"type":43,"tag":978,"props":2502,"children":2503},{"class":980,"line":1017},[2504],{"type":43,"tag":978,"props":2505,"children":2506},{},[2507],{"type":49,"value":2508},"                       IsVisible=\"True\" \u002F>\n",{"type":43,"tag":978,"props":2510,"children":2511},{"class":980,"line":1026},[2512],{"type":43,"tag":978,"props":2513,"children":2514},{},[2515],{"type":49,"value":2516},"\u003C\u002FShell.BackButtonBehavior>\n",{"type":43,"tag":52,"props":2518,"children":2519},{},[2520,2522,2528,2529,2535,2536,2542,2543,2549,2550,2556,2557,2563],{"type":49,"value":2521},"Properties: ",{"type":43,"tag":80,"props":2523,"children":2525},{"className":2524},[],[2526],{"type":49,"value":2527},"Command",{"type":49,"value":2302},{"type":43,"tag":80,"props":2530,"children":2532},{"className":2531},[],[2533],{"type":49,"value":2534},"CommandParameter",{"type":49,"value":2302},{"type":43,"tag":80,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":49,"value":2541},"IconOverride",{"type":49,"value":2302},{"type":43,"tag":80,"props":2544,"children":2546},{"className":2545},[],[2547],{"type":49,"value":2548},"TextOverride",{"type":49,"value":2302},{"type":43,"tag":80,"props":2551,"children":2553},{"className":2552},[],[2554],{"type":49,"value":2555},"IsVisible",{"type":49,"value":2302},{"type":43,"tag":80,"props":2558,"children":2560},{"className":2559},[],[2561],{"type":49,"value":2562},"IsEnabled",{"type":49,"value":910},{"type":43,"tag":58,"props":2565,"children":2567},{"id":2566},"inspecting-navigation-state",[2568],{"type":49,"value":2569},"Inspecting Navigation State",{"type":43,"tag":583,"props":2571,"children":2573},{"className":1205,"code":2572,"language":1207,"meta":591,"style":591},"\u002F\u002F Current URI location\nstring location = Shell.Current.CurrentState.Location.ToString();\n\n\u002F\u002F Current page\nPage page = Shell.Current.CurrentPage;\n\n\u002F\u002F Navigation stack of the current tab\nIReadOnlyList\u003CPage> stack = Shell.Current.Navigation.NavigationStack;\n",[2574],{"type":43,"tag":80,"props":2575,"children":2576},{"__ignoreMap":591},[2577,2585,2593,2600,2608,2616,2623,2631],{"type":43,"tag":978,"props":2578,"children":2579},{"class":980,"line":981},[2580],{"type":43,"tag":978,"props":2581,"children":2582},{},[2583],{"type":49,"value":2584},"\u002F\u002F Current URI location\n",{"type":43,"tag":978,"props":2586,"children":2587},{"class":980,"line":990},[2588],{"type":43,"tag":978,"props":2589,"children":2590},{},[2591],{"type":49,"value":2592},"string location = Shell.Current.CurrentState.Location.ToString();\n",{"type":43,"tag":978,"props":2594,"children":2595},{"class":980,"line":999},[2596],{"type":43,"tag":978,"props":2597,"children":2598},{"emptyLinePlaceholder":1030},[2599],{"type":49,"value":1033},{"type":43,"tag":978,"props":2601,"children":2602},{"class":980,"line":1008},[2603],{"type":43,"tag":978,"props":2604,"children":2605},{},[2606],{"type":49,"value":2607},"\u002F\u002F Current page\n",{"type":43,"tag":978,"props":2609,"children":2610},{"class":980,"line":1017},[2611],{"type":43,"tag":978,"props":2612,"children":2613},{},[2614],{"type":49,"value":2615},"Page page = Shell.Current.CurrentPage;\n",{"type":43,"tag":978,"props":2617,"children":2618},{"class":980,"line":1026},[2619],{"type":43,"tag":978,"props":2620,"children":2621},{"emptyLinePlaceholder":1030},[2622],{"type":49,"value":1033},{"type":43,"tag":978,"props":2624,"children":2625},{"class":980,"line":1036},[2626],{"type":43,"tag":978,"props":2627,"children":2628},{},[2629],{"type":49,"value":2630},"\u002F\u002F Navigation stack of the current tab\n",{"type":43,"tag":978,"props":2632,"children":2633},{"class":980,"line":1045},[2634],{"type":43,"tag":978,"props":2635,"children":2636},{},[2637],{"type":49,"value":2638},"IReadOnlyList\u003CPage> stack = Shell.Current.Navigation.NavigationStack;\n",{"type":43,"tag":58,"props":2640,"children":2642},{"id":2641},"navigation-events",[2643],{"type":49,"value":2644},"Navigation Events",{"type":43,"tag":52,"props":2646,"children":2647},{},[2648,2650,2655],{"type":49,"value":2649},"Override in ",{"type":43,"tag":80,"props":2651,"children":2653},{"className":2652},[],[2654],{"type":49,"value":501},{"type":49,"value":1810},{"type":43,"tag":583,"props":2657,"children":2659},{"className":1205,"code":2658,"language":1207,"meta":591,"style":591},"protected override void OnNavigated(ShellNavigatedEventArgs args)\n{\n    base.OnNavigated(args);\n    \u002F\u002F args.Current, args.Previous, args.Source\n}\n",[2660],{"type":43,"tag":80,"props":2661,"children":2662},{"__ignoreMap":591},[2663,2671,2678,2686,2694],{"type":43,"tag":978,"props":2664,"children":2665},{"class":980,"line":981},[2666],{"type":43,"tag":978,"props":2667,"children":2668},{},[2669],{"type":49,"value":2670},"protected override void OnNavigated(ShellNavigatedEventArgs args)\n",{"type":43,"tag":978,"props":2672,"children":2673},{"class":980,"line":990},[2674],{"type":43,"tag":978,"props":2675,"children":2676},{},[2677],{"type":49,"value":1235},{"type":43,"tag":978,"props":2679,"children":2680},{"class":980,"line":999},[2681],{"type":43,"tag":978,"props":2682,"children":2683},{},[2684],{"type":49,"value":2685},"    base.OnNavigated(args);\n",{"type":43,"tag":978,"props":2687,"children":2688},{"class":980,"line":1008},[2689],{"type":43,"tag":978,"props":2690,"children":2691},{},[2692],{"type":49,"value":2693},"    \u002F\u002F args.Current, args.Previous, args.Source\n",{"type":43,"tag":978,"props":2695,"children":2696},{"class":980,"line":1017},[2697],{"type":43,"tag":978,"props":2698,"children":2699},{},[2700],{"type":49,"value":1291},{"type":43,"tag":52,"props":2702,"children":2703},{},[2704,2710,2712,2718,2719,2725,2726,2732,2733,2739,2740,2746,2747,2753,2754,2760,2761,2767,2768,2774],{"type":43,"tag":80,"props":2705,"children":2707},{"className":2706},[],[2708],{"type":49,"value":2709},"ShellNavigationSource",{"type":49,"value":2711}," values: ",{"type":43,"tag":80,"props":2713,"children":2715},{"className":2714},[],[2716],{"type":49,"value":2717},"Push",{"type":49,"value":2302},{"type":43,"tag":80,"props":2720,"children":2722},{"className":2721},[],[2723],{"type":49,"value":2724},"Pop",{"type":49,"value":2302},{"type":43,"tag":80,"props":2727,"children":2729},{"className":2728},[],[2730],{"type":49,"value":2731},"PopToRoot",{"type":49,"value":2302},{"type":43,"tag":80,"props":2734,"children":2736},{"className":2735},[],[2737],{"type":49,"value":2738},"Insert",{"type":49,"value":2302},{"type":43,"tag":80,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":49,"value":2745},"Remove",{"type":49,"value":2302},{"type":43,"tag":80,"props":2748,"children":2750},{"className":2749},[],[2751],{"type":49,"value":2752},"ShellItemChanged",{"type":49,"value":2302},{"type":43,"tag":80,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":49,"value":2759},"ShellSectionChanged",{"type":49,"value":2302},{"type":43,"tag":80,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":49,"value":2766},"ShellContentChanged",{"type":49,"value":2302},{"type":43,"tag":80,"props":2769,"children":2771},{"className":2770},[],[2772],{"type":49,"value":2773},"Unknown",{"type":49,"value":910},{"type":43,"tag":58,"props":2776,"children":2778},{"id":2777},"common-pitfalls",[2779],{"type":49,"value":2780},"Common Pitfalls",{"type":43,"tag":65,"props":2782,"children":2783},{},[2784,2821,2845,2885,2908,2926,2943],{"type":43,"tag":69,"props":2785,"children":2786},{},[2787,2792,2794,2800,2802,2807,2808,2813,2815,2820],{"type":43,"tag":294,"props":2788,"children":2789},{},[2790],{"type":49,"value":2791},"Eager page creation",{"type":49,"value":2793},": Using ",{"type":43,"tag":80,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":49,"value":2799},"Content",{"type":49,"value":2801}," directly instead of ",{"type":43,"tag":80,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":49,"value":838},{"type":49,"value":840},{"type":43,"tag":80,"props":2809,"children":2811},{"className":2810},[],[2812],{"type":49,"value":846},{"type":49,"value":2814}," creates all pages at Shell init, hurting startup time. Always use ",{"type":43,"tag":80,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":49,"value":838},{"type":49,"value":910},{"type":43,"tag":69,"props":2822,"children":2823},{},[2824,2829,2830,2835,2837,2843],{"type":43,"tag":294,"props":2825,"children":2826},{},[2827],{"type":49,"value":2828},"Duplicate route names",{"type":49,"value":2294},{"type":43,"tag":80,"props":2831,"children":2833},{"className":2832},[],[2834],{"type":49,"value":534},{"type":49,"value":2836}," throws ",{"type":43,"tag":80,"props":2838,"children":2840},{"className":2839},[],[2841],{"type":49,"value":2842},"ArgumentException",{"type":49,"value":2844}," if a route name matches an existing route or a visual hierarchy route. Every route must be unique across the app.",{"type":43,"tag":69,"props":2846,"children":2847},{},[2848,2853,2855,2861,2863,2869,2871,2876,2878,2883],{"type":43,"tag":294,"props":2849,"children":2850},{},[2851],{"type":49,"value":2852},"Relative routes without registration",{"type":49,"value":2854},": You cannot ",{"type":43,"tag":80,"props":2856,"children":2858},{"className":2857},[],[2859],{"type":49,"value":2860},"GoToAsync(\"somepage\")",{"type":49,"value":2862}," unless ",{"type":43,"tag":80,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":49,"value":2868},"somepage",{"type":49,"value":2870}," was registered with ",{"type":43,"tag":80,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":49,"value":534},{"type":49,"value":2877},". Visual hierarchy pages use absolute ",{"type":43,"tag":80,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":49,"value":1357},{"type":49,"value":2884}," routes.",{"type":43,"tag":69,"props":2886,"children":2887},{},[2888,2893,2895,2900,2902,2907],{"type":43,"tag":294,"props":2889,"children":2890},{},[2891],{"type":49,"value":2892},"Fire-and-forget GoToAsync",{"type":49,"value":2894},": Not awaiting ",{"type":43,"tag":80,"props":2896,"children":2898},{"className":2897},[],[2899],{"type":49,"value":85},{"type":49,"value":2901}," causes race conditions and silent failures. Always ",{"type":43,"tag":80,"props":2903,"children":2905},{"className":2904},[],[2906],{"type":49,"value":409},{"type":49,"value":1317},{"type":43,"tag":69,"props":2909,"children":2910},{},[2911,2916,2918,2924],{"type":43,"tag":294,"props":2912,"children":2913},{},[2914],{"type":49,"value":2915},"Wrong absolute route path",{"type":49,"value":2917},": Absolute routes must match the full path through the visual hierarchy (",{"type":43,"tag":80,"props":2919,"children":2921},{"className":2920},[],[2922],{"type":49,"value":2923},"\u002F\u002FFlyoutItem\u002FTab\u002FShellContent",{"type":49,"value":2925},"). Wrong paths produce silent no-ops, not exceptions.",{"type":43,"tag":69,"props":2927,"children":2928},{},[2929,2934,2936,2941],{"type":43,"tag":294,"props":2930,"children":2931},{},[2932],{"type":49,"value":2933},"Manipulating Tab.Stack directly",{"type":49,"value":2935},": The navigation stack is read-only. Use ",{"type":43,"tag":80,"props":2937,"children":2939},{"className":2938},[],[2940],{"type":49,"value":85},{"type":49,"value":2942}," for all navigation changes.",{"type":43,"tag":69,"props":2944,"children":2945},{},[2946,2958,2960,2965,2967,2972,2973,2978],{"type":43,"tag":294,"props":2947,"children":2948},{},[2949,2951,2956],{"type":49,"value":2950},"Forgetting ",{"type":43,"tag":80,"props":2952,"children":2954},{"className":2953},[],[2955],{"type":49,"value":1864},{"type":49,"value":2957}," for async guards",{"type":49,"value":2959},": Synchronous cancellation in ",{"type":43,"tag":80,"props":2961,"children":2963},{"className":2962},[],[2964],{"type":49,"value":1871},{"type":49,"value":2966}," works, but async checks require ",{"type":43,"tag":80,"props":2968,"children":2970},{"className":2969},[],[2971],{"type":49,"value":1864},{"type":49,"value":487},{"type":43,"tag":80,"props":2974,"children":2976},{"className":2975},[],[2977],{"type":49,"value":441},{"type":49,"value":2979}," to avoid race conditions.",{"type":43,"tag":58,"props":2981,"children":2983},{"id":2982},"references",[2984],{"type":49,"value":2985},"References",{"type":43,"tag":65,"props":2987,"children":2988},{},[2989,3000,3009,3019,3029],{"type":43,"tag":69,"props":2990,"children":2991},{},[2992,2998],{"type":43,"tag":80,"props":2993,"children":2995},{"className":2994},[],[2996],{"type":49,"value":2997},"references\u002Fshell-navigation-api.md",{"type":49,"value":2999}," — Full API reference for Shell hierarchy, routes, tabs, flyout, and navigation",{"type":43,"tag":69,"props":3001,"children":3002},{},[3003],{"type":43,"tag":121,"props":3004,"children":3007},{"href":3005,"rel":3006},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fnavigation",[125],[3008],{"type":49,"value":50},{"type":43,"tag":69,"props":3010,"children":3011},{},[3012],{"type":43,"tag":121,"props":3013,"children":3016},{"href":3014,"rel":3015},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Ftabs",[125],[3017],{"type":49,"value":3018},".NET MAUI Shell Tabs",{"type":43,"tag":69,"props":3020,"children":3021},{},[3022],{"type":43,"tag":121,"props":3023,"children":3026},{"href":3024,"rel":3025},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fflyout",[125],[3027],{"type":49,"value":3028},".NET MAUI Shell Flyout",{"type":43,"tag":69,"props":3030,"children":3031},{},[3032],{"type":43,"tag":121,"props":3033,"children":3036},{"href":3034,"rel":3035},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fshell\u002Fpages",[125],[3037],{"type":49,"value":3038},".NET MAUI Shell Pages",{"type":43,"tag":3040,"props":3041,"children":3042},"style",{},[3043],{"type":49,"value":3044},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3046,"total":3210},[3047,3063,3078,3093,3111,3125,3144,3154,3166,3176,3189,3200],{"slug":3048,"name":3048,"fn":3049,"description":3050,"org":3051,"tags":3052,"stars":3060,"repoUrl":3061,"updatedAt":3062},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3053,3054,3057],{"name":17,"slug":18,"type":15},{"name":3055,"slug":3056,"type":15},"Engineering","engineering",{"name":3058,"slug":3059,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3064,"name":3064,"fn":3065,"description":3066,"org":3067,"tags":3068,"stars":25,"repoUrl":26,"updatedAt":3077},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3069,3070,3073,3076],{"name":17,"slug":18,"type":15},{"name":3071,"slug":3072,"type":15},"Code Analysis","code-analysis",{"name":3074,"slug":3075,"type":15},"Debugging","debugging",{"name":3058,"slug":3059,"type":15},"2026-07-12T08:23:25.400375",{"slug":3079,"name":3079,"fn":3080,"description":3081,"org":3082,"tags":3083,"stars":25,"repoUrl":26,"updatedAt":3092},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3084,3085,3088,3089],{"name":17,"slug":18,"type":15},{"name":3086,"slug":3087,"type":15},"Android","android",{"name":3074,"slug":3075,"type":15},{"name":3090,"slug":3091,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3094,"name":3094,"fn":3095,"description":3096,"org":3097,"tags":3098,"stars":25,"repoUrl":26,"updatedAt":3110},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3099,3100,3101,3104,3107],{"name":17,"slug":18,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3102,"slug":3103,"type":15},"iOS","ios",{"name":3105,"slug":3106,"type":15},"macOS","macos",{"name":3108,"slug":3109,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3112,"name":3112,"fn":3113,"description":3114,"org":3115,"tags":3116,"stars":25,"repoUrl":26,"updatedAt":3124},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3117,3118,3121],{"name":3071,"slug":3072,"type":15},{"name":3119,"slug":3120,"type":15},"QA","qa",{"name":3122,"slug":3123,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":3126,"name":3126,"fn":3127,"description":3128,"org":3129,"tags":3130,"stars":25,"repoUrl":26,"updatedAt":3143},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3131,3132,3135,3137,3140],{"name":17,"slug":18,"type":15},{"name":3133,"slug":3134,"type":15},"Blazor","blazor",{"name":3136,"slug":1207,"type":15},"C#",{"name":3138,"slug":3139,"type":15},"UI Components","ui-components",{"name":3141,"slug":3142,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":3145,"name":3145,"fn":3146,"description":3147,"org":3148,"tags":3149,"stars":25,"repoUrl":26,"updatedAt":3153},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3150,3151,3152],{"name":3071,"slug":3072,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3090,"slug":3091,"type":15},"2026-07-12T08:21:34.637923",{"slug":3155,"name":3155,"fn":3156,"description":3157,"org":3158,"tags":3159,"stars":25,"repoUrl":26,"updatedAt":3165},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3160,3163,3164],{"name":3161,"slug":3162,"type":15},"Build","build",{"name":3074,"slug":3075,"type":15},{"name":3055,"slug":3056,"type":15},"2026-07-19T05:38:19.340791",{"slug":3167,"name":3167,"fn":3168,"description":3169,"org":3170,"tags":3171,"stars":25,"repoUrl":26,"updatedAt":3175},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3172,3173,3174],{"name":17,"slug":18,"type":15},{"name":3055,"slug":3056,"type":15},{"name":3058,"slug":3059,"type":15},"2026-07-19T05:38:18.364937",{"slug":3177,"name":3177,"fn":3178,"description":3179,"org":3180,"tags":3181,"stars":25,"repoUrl":26,"updatedAt":3188},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3182,3183,3186,3187],{"name":3055,"slug":3056,"type":15},{"name":3184,"slug":3185,"type":15},"Monitoring","monitoring",{"name":3058,"slug":3059,"type":15},{"name":3122,"slug":3123,"type":15},"2026-07-12T08:21:35.865649",{"slug":3190,"name":3190,"fn":3191,"description":3192,"org":3193,"tags":3194,"stars":25,"repoUrl":26,"updatedAt":3199},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3195,3196,3197,3198],{"name":17,"slug":18,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3055,"slug":3056,"type":15},{"name":3058,"slug":3059,"type":15},"2026-07-12T08:21:40.961722",{"slug":3201,"name":3201,"fn":3202,"description":3203,"org":3204,"tags":3205,"stars":25,"repoUrl":26,"updatedAt":3209},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3206,3207,3208],{"name":3074,"slug":3075,"type":15},{"name":3055,"slug":3056,"type":15},{"name":3119,"slug":3120,"type":15},"2026-07-19T05:38:14.336279",144,{"items":3212,"total":3261},[3213,3220,3227,3235,3241,3249,3255],{"slug":3064,"name":3064,"fn":3065,"description":3066,"org":3214,"tags":3215,"stars":25,"repoUrl":26,"updatedAt":3077},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3216,3217,3218,3219],{"name":17,"slug":18,"type":15},{"name":3071,"slug":3072,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3058,"slug":3059,"type":15},{"slug":3079,"name":3079,"fn":3080,"description":3081,"org":3221,"tags":3222,"stars":25,"repoUrl":26,"updatedAt":3092},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3223,3224,3225,3226],{"name":17,"slug":18,"type":15},{"name":3086,"slug":3087,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3090,"slug":3091,"type":15},{"slug":3094,"name":3094,"fn":3095,"description":3096,"org":3228,"tags":3229,"stars":25,"repoUrl":26,"updatedAt":3110},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3230,3231,3232,3233,3234],{"name":17,"slug":18,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3102,"slug":3103,"type":15},{"name":3105,"slug":3106,"type":15},{"name":3108,"slug":3109,"type":15},{"slug":3112,"name":3112,"fn":3113,"description":3114,"org":3236,"tags":3237,"stars":25,"repoUrl":26,"updatedAt":3124},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3238,3239,3240],{"name":3071,"slug":3072,"type":15},{"name":3119,"slug":3120,"type":15},{"name":3122,"slug":3123,"type":15},{"slug":3126,"name":3126,"fn":3127,"description":3128,"org":3242,"tags":3243,"stars":25,"repoUrl":26,"updatedAt":3143},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3244,3245,3246,3247,3248],{"name":17,"slug":18,"type":15},{"name":3133,"slug":3134,"type":15},{"name":3136,"slug":1207,"type":15},{"name":3138,"slug":3139,"type":15},{"name":3141,"slug":3142,"type":15},{"slug":3145,"name":3145,"fn":3146,"description":3147,"org":3250,"tags":3251,"stars":25,"repoUrl":26,"updatedAt":3153},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3252,3253,3254],{"name":3071,"slug":3072,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3090,"slug":3091,"type":15},{"slug":3155,"name":3155,"fn":3156,"description":3157,"org":3256,"tags":3257,"stars":25,"repoUrl":26,"updatedAt":3165},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3258,3259,3260],{"name":3161,"slug":3162,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3055,"slug":3056,"type":15},96]