A cross-engine UI library for .NET games. The engine-agnostic core handles layout, controls, markup, styling, templating, data binding, input and animations. Thin integration packages connect it to a specific engine's rendering and input, so the screens you build don't depend on the engine underneath.
Status: early alpha (
0.1.0-alpha). Published on NuGet as prerelease packages; APIs may change between alphas.
Documentation: icyui.dev · на русском
- Write the screen once. Describe it in XML markup with bindings, styles and templates, or build it in C#. The same screen runs on every supported engine.
- Built for games. Keyboard and gamepad navigation, touch gestures, drag-and-drop, DPI-aware scaling and an overlay layer for popups and dialogs are part of the core, not add-ons.
- Looks right from the start. A built-in default theme covers every control, and styles, visual states and control templates let you replace it piece by piece.
- Fast iteration. An in-game editor and markup hot reload (
IcyUI.Design) let you change a screen while the game runs. - Small engine footprint. The core never references an engine type. Each integration is a thin connector, so supporting another engine is a bounded job.
Requires the .NET 10 SDK. Add the package for your engine:
dotnet add package IcyUI.Stride --prerelease
dotnet add package IcyUI.MonoGame --prerelease
Describe a screen in markup (Menu.xml):
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Vertical">
<TextBlock FontSize="32" Margin="0,0,0,24" HorizontalAlignment="Center" Text="{Binding Path=Title}" />
<Button Padding="24,8" Margin="0,0,0,8" Command="{Binding Path=PlayCommand}">Play</Button>
<Button Padding="24,8" Command="{Binding Path=QuitCommand}">Quit</Button>
</StackPanel>Then load it in your game. In a MonoGame Game:
this.UseIcyUI().MainCanvas.LoadMarkup("Menu.xml", new MenuViewModel());In Stride, call Game.UseIcyUI() from a startup script instead. The setup for each engine, and the MenuViewModel that the bindings read, are in Getting started.
![]() Sliders and progress |
![]() Lists and drop-downs |
![]() Trees |
![]() Tabs and navigation |
![]() Color picker and property grid |
![]() Windows and dialogs |
Also: Button, ToggleButton, CheckBox, TextBox, Expander, SplitPane, ScrollViewer (with virtualization), and the Grid, StackPanel and WrapGrid panels. See the controls reference.
| Package | Status |
|---|---|
IcyUI.Stride |
Integration for Stride 4.4+ |
IcyUI.MonoGame |
Integration for MonoGame 3.8.5.1+, backend-neutral (DesktopGL or WindowsDX) |
IcyUI.FNA |
Planned |
- Getting started: installation and your first screen.
- Guides: a game menu, gamepad navigation, custom controls and themes, localization, hot reload and the editor, writing an engine integration.
- API reference.
- Samples: sample hosts for both engines live in
sources/MonoGame Sampleandsources/Stride Sample. Their demos are shared fromsources/Shared Samples.
Requires the .NET 10 SDK.
dotnet build sources/IcyUI.sln
dotnet test sources/IcyUI.Tests/IcyUI.Tests.csproj
The documentation site is built from docfx/ (see CLAUDE.md).
The project started as MysticUI, a Stride UI library based on Myra, and was later renamed AquaUI. It has since been rewritten as IcyUI.






