PleasantUI.ToolKit
5.3.1
dotnet add package PleasantUI.ToolKit --version 5.3.1
NuGet\Install-Package PleasantUI.ToolKit -Version 5.3.1
<PackageReference Include="PleasantUI.ToolKit" Version="5.3.1" />
<PackageVersion Include="PleasantUI.ToolKit" Version="5.3.1" />
<PackageReference Include="PleasantUI.ToolKit" />
paket add PleasantUI.ToolKit --version 5.3.1
#r "nuget: PleasantUI.ToolKit, 5.3.1"
#:package PleasantUI.ToolKit@5.3.1
#addin nuget:?package=PleasantUI.ToolKit&version=5.3.1
#tool nuget:?package=PleasantUI.ToolKit&version=5.3.1
<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, Google Material 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.
🏛️ Philosophy
The philosophy is to provide the user with a pleasant experience in using applications built on this library. This library isn't intended to be compared to other design principles or other UI libraries. If the interface looks good, then this library is doing its job.
This library may also contain elements from other design principles or UI libraries if it makes the interface pleasant enough (but with due attribution, of course).
✨ Features
Complete control theming
Every standard Avalonia control is receiving a complete overhaul: rounded corners, multi-layered fills, smooth transitions on hover and click, 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 | ![]() |
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- A localization key analyzer is included. You won't miss any unused keys in your applications!
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.3.0" />
<PackageReference Include="PleasantUI.DataGrid" Version="5.3.0" />
<PackageReference Include="PleasantUI.MaterialIcons" Version="5.3.0" />
<PackageReference Include="PleasantUI.ToolKit" Version="5.3.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="{StaticResource AccentButtonTheme}" Content="Accent" />
<Button Theme="{StaticResource DangerButtonTheme}" Content="Danger" />
<Button Theme="{StaticResource 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
Main
- Avalonia under license from MIT
- Built with JetBrains Rider
Controls and Code
- Aura.UI (PieroCastillo) - NavigationView and AuraTabView under license from MIT
- ProgressRing (ymg2006) - under license from MIT
- RichTextKit (toptensoftware) - implementation of BinarySearch under license from Apache 2.0
- weather (rocksdanister) - implementation of BackdropBlurBorder under license from MIT
- Xaml.Behaviors.Interactions.Animated (Egolds) - implementation of VerticalScrollViewerAnimatedBehavior under license from MIT
- BilibiliClient (afunc233) - implementation of VirtualizingWrapPanel
- Material.Avalonia (CommunityAvalonia) - implementation of Ripple Effect under license from MIT
<img src="https://i.imgur.com/IvbDwuz.png" width="360" align="right"/>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Avalonia (>= 12.1.1)
- Avalonia.Controls.ColorPicker (>= 12.1.1)
- Avalonia.Skia (>= 12.1.1)
- PleasantUI (>= 5.3.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.3.1 | 289 | 8/1/2026 |
| 5.3.0 | 149 | 7/19/2026 |
| 5.2.2 | 879 | 4/11/2026 |
| 5.2.1 | 136 | 4/10/2026 |
| 5.2.1-fix | 126 | 4/10/2026 |
| 5.2.0 | 132 | 4/10/2026 |
| 5.1.3-alpha3-fix | 133 | 4/8/2026 |
| 5.1.3-alpha3 | 123 | 4/8/2026 |
| 5.1.3-alpha2-fix | 127 | 4/4/2026 |









