A Windows 8.1 Metro UI component library for Blazor.
MetroBlazor brings the flat, squared, touch-first look and feel of Windows 8.1 Metro to modern browsers. It is built as an independent Razor Class Library that ships as a NuGet package, with no dependency on a specific host application.
- Touch-first controls — flat geometry, strong color, and square corners.
- Live tiles — animated tile content with configurable intervals.
- Tile groups — drag sorting, removal, and size cycling (Small / Medium / Wide / Large).
- Built-in icon library — searchable SVG icons with a stable name-based API.
- Theming — Dark, Light, Blue, and Purple variants with a cascading theme state.
- Accessible — touch, mouse, keyboard, focus visibility, ARIA, and reduced-motion support.
- Self-contained — no Fluent UI icon runtime dependency; icons are embedded SVG paths.
- .NET 10
- Microsoft.FluentUI.AspNetCore.Components
4.13.x(used selectively for accessibility and complex infrastructure; not exposed in the public API)
dotnet add package MetroBlazorRegister the Fluent UI services in Program.cs:
builder.Services.AddFluentUIComponents();Add the namespace to your _Imports.razor:
@using MetroBlazorWrap your app in MetroTheme and start using components:
<MetroTheme>
<MetroTile Label="Photos" Icon="home" AccentColor="#0078D7" />
</MetroTheme>MetroTheme establishes the Metro design tokens and cascades a MetroThemeState that any
descendant can use to switch themes at runtime.
<MetroTheme Mode="Dark">
<App />
</MetroTheme>Available variants:
| Variant | Description |
|---|---|
Dark |
Default dark Metro theme |
Light |
Light Metro theme |
Blue |
Blue accent theme |
Purple |
Purple accent theme |
[CascadingParameter] public MetroThemeState? ThemeState { get; set; }
ThemeState!.Variant = MetroThemeVariant.Blue;MetroTheme— theme root, tokens, and cascading theme stateMetroIcon/MetroIconCatalog— searchable embedded SVG icon libraryMetroText— Metro typography (Display, Header, Subheader, Body, Label, Caption, Link)MetroPageTransition— animated content transition
MetroTile— live tiles with Small / Medium / Wide / Large sizesMetroTileGroup— reorderable, resizable tile groups;ReadOnlyturns it into a clickable launcher gridMetroHub— spacious grouped content surfaceMetroSemanticZoom— grouped overview / detailed viewMetroSurface— reusable surface container
MetroButton— solid, quiet, and icon-only (bordered / non-bordered) buttonsMetroInput— underline text fieldMetroSelect— native select with Metro treatmentMetroToggle— squared switchMetroCheckbox— squared checkboxMetroRadio— squared radioMetroSlider— thick squared sliderMetroSearchBox— filled search with icon and clear actionMetroRating— star rating with pointer and keyboard input
MetroProgress— segmented determinate and staggered indeterminate progressMetroBadge— compact status and count labelMetroTooltip— hover / focus hint attached to its trigger
MetroListView— flat, touch-friendly listMetroDataGrid— responsive semantic tableMetroTreeView— expandable hierarchy
MetroSidebar— persistent collapsible left bladeMetroNavigation— grouped navigation with expandable itemsMetroPivot— Windows 8 style section navigationMetroBreadcrumb— slash-separated path navigationMetroBlade— right-side detail surface
MetroLayout— responsive app shell: persistent sidebar rail on desktop, overlay drawer with scrim on mobileMetroAppFrame— deprecated application frame with header and content regions; useMetroLayoutwithHeaderTemplate
MetroCommandBar— flat command actionsMetroAppBar— bottom command surfaceMetroContextMenu— right-click command menu that opens at the pointerMetroFlyout— contextual surfaceMetroContentDialog— centered modal dialog
MetroIcon renders embedded SVG paths sourced from Microsoft Fluent UI System Icons.
<MetroIcon Name="settings" Size="MetroIconSize.Large" />Search the icon catalog programmatically:
IReadOnlyList<string> names = MetroIconCatalog.Search("arrow");Use PathOverride to supply application-owned SVG paths without adding any runtime
dependency. MetroTile.Icon also resolves catalog names automatically, falling back to
rendering the value as a text glyph when no catalog icon matches.
<MetroTile Label="Weather" Live="true" LiveInterval="3000">
<LiveContent>
<span>22°C Sunny</span>
</LiveContent>
</MetroTile>Tile groups support long-press or right-click edit mode, drag sorting, tile removal, and size cycling.
<MetroTileGroup Title="Pinned" Items="tiles"
ItemMoved="OnTileMoved"
ItemSizeChanged="OnTileSizeChanged"
ItemRemoved="OnTileRemoved" />Run the interactive documentation site to browse every component on its own routed page
(/components/tile, /components/button, ...) with live demos, code samples, parameter
tables, themes, and a searchable icon browser. The site itself is built entirely with
MetroBlazor — the shell is MetroLayout + MetroNavigation, the header uses
MetroBreadcrumb, and the overview page navigates with MetroTile:
dotnet run --project showcase/MetroBlazor.ShowcaseBuild, test, and package the library:
dotnet build MetroBlazor.slnx
dotnet test MetroBlazor.slnx
dotnet pack src/MetroBlazor/MetroBlazor.csproj -c ReleaseNuGet packages are written to artifacts/packages/.
MetroBlazor.slnx
├── src/MetroBlazor/ Razor Class Library (NuGet package)
├── showcase/ Interactive showcase (Blazor Server)
└── tests/ bUnit tests (xunit)
- Desktop Chrome (latest)
- Desktop Firefox (latest)
- Mobile Chrome (latest)
- Mobile Safari (latest)