PleasantUI 5.2.2
dotnet add package PleasantUI --version 5.2.2
NuGet\Install-Package PleasantUI -Version 5.2.2
<PackageReference Include="PleasantUI" Version="5.2.2" />
<PackageVersion Include="PleasantUI" Version="5.2.2" />
<PackageReference Include="PleasantUI" />
paket add PleasantUI --version 5.2.2
#r "nuget: PleasantUI, 5.2.2"
#:package PleasantUI@5.2.2
#addin nuget:?package=PleasantUI&version=5.2.2
#tool nuget:?package=PleasantUI&version=5.2.2
<img align="center" src="https://i.imgur.com/Sr3crB8.png">

PleasantUI
Repositories: Original (Onebeld) · Fork (ghudulf)
PleasantUI is a cross-platform UI theme and control library for Avalonia, inspired by Microsoft Fluent Design and the WinUI/UWP visual language. It completely re-styles every standard Avalonia control and adds a suite of custom controls, a multi-theme engine with custom theme support, a reactive localization system, and a custom window chrome — all AOT-compatible with no rd.xml required.
The project has been in active development since 2021, originally as part of the Regul and Regul Save Cleaner projects.
✨ Features
Complete Fluent-style control theming
Every standard Avalonia control gets a full Fluent Design makeover — rounded corners, layered fill colors, smooth pointer-over and pressed transitions, and accent color integration:
| Control | Control | Control |
|---|---|---|
| Button (+ AppBar, Accent, Danger variants) | CheckBox | RadioButton |
| ToggleButton / ToggleSwitch | RepeatButton / ButtonSpinner | Slider |
| TextBox / AutoCompleteBox | NumericUpDown | ComboBox / DropDownButton |
| Calendar / CalendarDatePicker / TimePicker | DataGrid | ListBox / TreeView |
| Expander | TabControl / TabItem | ScrollBar / ScrollViewer |
| ProgressBar | Menu / ContextMenu | ToolTip |
| Carousel | Separator | NotificationCard |
Custom Pleasant controls
Controls built from scratch that go beyond what Avalonia ships:
| Control | Description | Demo |
|---|---|---|
PleasantWindow |
Custom window chrome with a Fluent title bar, subtitle, custom icon/title content, optional blur, content-extends-into-titlebar, and macOS caption override | None |
NavigationView / NavigationViewItem |
Collapsible side navigation panel, similar to WinUI NavigationView | None |
PleasantTabView / PleasantTabItem |
Chromium-style tab strip with add/close buttons and scrollable tab bar | None |
ContentDialog |
Modal overlay dialog with bottom button panel and smooth scroll content area | None |
PleasantSnackbar |
Temporary non-intrusive notification bar | ![]() |
ProgressRing |
Circular progress indicator — both determinate and indeterminate with animated arc | ![]() |
OptionsDisplayItem |
Settings-style row with header, description, icon, action button slot, navigation chevron, and expandable content | ![]() |
InformationBlock |
Compact pill-shaped label combining an icon and a value | ![]() |
MarkedTextBox / MarkedNumericUpDown |
Input controls with inline label/unit markers | None |
RippleEffect |
Material-style ripple click feedback | ![]() |
SmoothScrollViewer |
ScrollViewer with inertia gesture support | None |
PleasantMiniWindow |
Lightweight floating window | None |
Timeline |
Displays a list of events in chronological order along a vertical axis. Supports four layout modes, custom icons, and five severity types. | ![]() |
InstallWizard |
A multi-step installation wizard with a sidebar step list, progress bar, and Back / Next / Cancel navigation. | ![]() |
PleasantMenu |
A customizable flyout menu with a title, optional info badges, a grid of large icon buttons, and a footer bar with small utility buttons. | ![]() |
PathPicker |
Combines a read-only TextBox with a browse button. Supports OpenFile, SaveFile, and OpenFolder modes, optional multi-select, file-type filters, and two-way binding on the selected path text. | ![]() |
PopConfirm |
Wraps any trigger control and shows a small popup with a header, body, and Confirm / Cancel buttons before executing a command. | ![]() |
Theme engine
- Built-in themes: Light, Dark, Mint, Strawberry, Ice, Sunny, Spruce, Cherry, Cave, Lunar
- System mode — follows the OS light/dark preference automatically
- Custom themes — create, edit, export, import, and persist your own color palettes via the built-in
ThemeEditorWindow - Accent color follows the OS accent or can be overridden per-user; light/dark variants and gradient pairs are generated automatically
- Settings are persisted to disk automatically on desktop; mobile apps can save manually
Localization system
Localizersingleton backed by .NETResourceManager— add any number of.resxresource files{Localize Key}AXAML markup extension binds reactively — switching language updates every bound string instantly without reloading viewsLocalizer.TrDefault(key, fallback)for safe lookups that fall back to a raw string instead of an error messageLocalizationChangedevent for view models and code-behind to react to language switches
Packages
| Package | Description |
|---|---|
PleasantUI |
Core theme, all control styles, Pleasant controls, theme engine, localization |
PleasantUI.ToolKit |
MessageBox, ThemeEditorWindow, color picker utilities |
PleasantUI.MaterialIcons |
Material Design icon geometry library for use with PathIcon |
PleasantUI.DataGrid |
Fluent-styled DataGrid extension |
📖 Documentation
Detailed reference docs for each control are in the docs/ folder:
| Doc | Controls |
|---|---|
| PleasantWindow | PleasantWindow, IPleasantSplashScreen |
| PleasantMiniWindow | PleasantMiniWindow |
| PleasantTitleBar | PleasantTitleBar |
| PleasantCaptionButtons | PleasantCaptionButtons |
| NavigationView | NavigationView, NavigationViewItem |
| PleasantTabView | PleasantTabView, PleasantTabItem |
| ContentDialog | ContentDialog |
| MessageBox | MessageBox (ToolKit) |
| PleasantDialog | PleasantDialog (ToolKit) |
| CrashReportDialog | CrashReportDialog |
| StepDialog | StepDialog |
| PleasantSnackbar | PleasantSnackbar |
| ProgressRing | ProgressRing |
| OptionsDisplayItem | OptionsDisplayItem |
| InformationBlock | InformationBlock |
| Timeline | Timeline, TimelineItem |
| InstallWizard | InstallWizard, WizardStep |
| PathPicker | PathPicker |
| PopConfirm | PopConfirm |
| PleasantMenu | PleasantMenu, PleasantMenuItem, PleasantMenuFooterItem |
| PleasantMenuFlyout | PleasantMenuFlyout |
| PleasantFlyout | PleasantFlyout |
| PinCode | PinCode |
| SelectionList | SelectionList, SelectionListItem |
| RippleEffect | RippleEffect |
| SmoothScrollViewer | SmoothScrollViewer |
| MarkedInputs | MarkedTextBox, MarkedNumericUpDown |
| MarkedTextBox | MarkedTextBox |
| MarkedNumericUpDown | MarkedNumericUpDown |
| PleasantDatePicker | PleasantDatePicker |
| PleasantBorder | PleasantBorder |
| BackdropBlurBorder | BackdropBlurBorder |
| ShadowBorder | ShadowBorder |
| PleasantTrayPopup | PleasantTrayPopup, StatusItem |
| DataGrid | PleasantUI.DataGrid package |
| PropertyGrid | PropertyGrid, PropertyRow |
| CommandBar | CommandBar, CommandBarButton, CommandBarToggleButton |
| BreadcrumbBar | BreadcrumbBar, BreadcrumbBarItem |
| PleasantDrawer | PleasantDrawer |
| DashboardCard | DashboardCard |
| DownloadPanel | DownloadPanel |
| LogViewerPanel | LogViewerPanel |
| TerminalPanel | TerminalPanel |
| TreeViewPanel | TreeViewPanel, TreeViewSection |
| ItemListPanel | ItemListPanel |
| VirtualizingWrapPanel | VirtualizingWrapPanel |
| PleasantView | PleasantView |
| PleasantSplashScreen | PleasantSplashScreen |
| ModalWindowHost | ModalWindowHost |
| ThemePreviewVariantScope | ThemePreviewVariantScope |
| Localization | Localizer, {Localize} markup extension |
| Theme Engine | PleasantTheme, custom themes, color tokens |
🚀 Getting Started
Install
Package List (Avalonia 12)
Published on NuGet:
<PackageReference Include="PleasantUI" Version="5.2.0" />
<PackageReference Include="PleasantUI.DataGrid" Version="5.2.0" />
<PackageReference Include="PleasantUI.MaterialIcons" Version="5.2.0" />
<PackageReference Include="PleasantUI.ToolKit" Version="5.2.0" />
Add the theme
In your App.axaml, add PleasantTheme to your styles:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YourApp.App">
<Application.Styles>
<PleasantTheme />
</Application.Styles>
</Application>
Initialize correctly
Make sure AvaloniaXamlLoader.Load(this) is called in Initialize():
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this); // required
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow
{
DataContext = new MainWindowViewModel(),
};
}
base.OnFrameworkInitializationCompleted();
}
}
Use PleasantWindow
Replace Window with PleasantWindow to get the custom Fluent title bar:
using PleasantUI.Controls;
public partial class MainWindow : PleasantWindow
{
public MainWindow() => InitializeComponent();
}
<PleasantWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="YourApp.Views.MainWindow"
Title="Avalonia Application">
</PleasantWindow>
Key PleasantWindow properties:
| Property | Type | Description |
|---|---|---|
TitleBarType |
Classic / ClassicExtended |
Title bar layout style |
ExtendsContentIntoTitleBar |
bool |
Lets content render behind the title bar |
Subtitle |
string |
Secondary text shown next to the title |
DisplayIcon |
object |
Custom icon content in the title bar |
DisplayTitle |
object |
Custom title content (e.g. a PathIcon) |
EnableBlur |
bool |
Acrylic/blur window background |
CaptionButtons |
enum | Which caption buttons to show |
LeftTitleBarContent |
object |
Content injected left of the title |
🌍 Localization
Register your .resx resource managers in your Application constructor:
public App()
{
Localizer.AddRes(new ResourceManager(typeof(Properties.Localizations.App)));
Localizer.ChangeLang("en");
}
Use {Localize Key} in AXAML — updates live when the language changes:
<TextBlock Text="{Localize WelcomeMessage}" />
<Button Content="{Localize SaveButton}" />
Switch language at runtime:
Localizer.ChangeLang("ru");
Safe lookup with fallback in code-behind:
string title = Localizer.TrDefault("DialogTitle", "Confirm");
🔲 Button variants
<Button Content="Default" />
<Button Theme="{DynamicResource AccentButtonTheme}" Content="Accent" />
<Button Theme="{DynamicResource DangerButtonTheme}" Content="Danger" />
<Button Theme="{DynamicResource AppBarButtonTheme}" Content="AppBar" />
📃 OptionsDisplayItem
<OptionsDisplayItem Header="Account"
Description="Manage your account"
Icon="{x:Static MaterialIcons.AccountOutline}"
Navigates="True" />
<OptionsDisplayItem Header="Dark mode"
Icon="{x:Static MaterialIcons.WeatherNight}">
<OptionsDisplayItem.ActionButton>
<ToggleSwitch />
</OptionsDisplayItem.ActionButton>
</OptionsDisplayItem>
<OptionsDisplayItem Header="Advanced" Expands="True">
<OptionsDisplayItem.Content>
<StackPanel>
<CheckBox Content="Enable feature X" />
</StackPanel>
</OptionsDisplayItem.Content>
</OptionsDisplayItem>
🖼️ Screenshots
❤️ Credits
- Avalonia
- Some controls inspired by PieroCastillo's Aura.UI
- ProgressRing by ymg2006
- Built with JetBrains Rider
<img src="https://i.imgur.com/IvbDwuz.png" width="360" align="right"/>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- Avalonia (>= 12.0.0)
- Avalonia.Skia (>= 12.0.0)
- System.Text.Json (>= 9.0.8)
- Xaml.Behaviors.Interactivity (>= 12.0.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on PleasantUI:
| Package | Downloads |
|---|---|
|
PleasantUI.DataGrid
PleasantUI is a cross-platform UI theme and control library for Avalonia, inspired by Microsoft Fluent Design and the WinUI/UWP visual language. It provides complete re-styled themes for all standard Avalonia controls — buttons, checkboxes, sliders, text boxes, data grids, calendars, combo boxes, and more — along with a suite of custom Pleasant controls including NavigationView, PleasantTabView, ProgressRing, OptionsDisplayItem, PleasantSnackbar, InformationBlock, ContentDialog, and a full theme editor with custom theme support. Supports light, dark, and multiple accent color themes out of the box, with a reactive localization system and desktop/mobile adaptive layouts. |
|
|
PleasantUI.ToolKit
PleasantUI is a cross-platform UI theme and control library for Avalonia, inspired by Microsoft Fluent Design and the WinUI/UWP visual language. It provides complete re-styled themes for all standard Avalonia controls — buttons, checkboxes, sliders, text boxes, data grids, calendars, combo boxes, and more — along with a suite of custom Pleasant controls including NavigationView, PleasantTabView, ProgressRing, OptionsDisplayItem, PleasantSnackbar, InformationBlock, ContentDialog, and a full theme editor with custom theme support. Supports light, dark, and multiple accent color themes out of the box, with a reactive localization system and desktop/mobile adaptive layouts. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.2.2 | 161 | 4/11/2026 |
| 5.2.1 | 136 | 4/10/2026 |
| 5.2.1-fix | 119 | 4/10/2026 |
| 5.2.0 | 133 | 4/10/2026 |
| 5.1.3-alpha3-fix | 126 | 4/8/2026 |
| 5.1.3-alpha3 | 121 | 4/8/2026 |
| 5.1.3-alpha2-fix | 127 | 4/4/2026 |
| 5.0.0-alpha3 | 222 | 11/4/2024 |
| 5.0.0-alpha2 | 272 | 11/4/2024 |
| 5.0.0-alpha1 | 196 | 9/20/2024 |
| 4.1.0-beta3 | 189 | 7/4/2024 |
| 4.1.0-beta2 | 182 | 6/19/2024 |
| 4.1.0-beta1 | 195 | 4/25/2024 |
| 4.0.1 | 375 | 3/27/2024 |
| 4.0.0 | 261 | 2/18/2024 |
| 4.0.0-alpha.3 | 135 | 1/29/2024 |
| 4.0.0-alpha.2 | 122 | 1/27/2024 |
| 4.0.0-alpha.1 | 210 | 1/6/2024 |
| 3.1.1 | 345 | 11/24/2023 |
| 3.1.0 | 197 | 10/8/2023 |









