XAvalonia.Controls
0.3.0
dotnet add package XAvalonia.Controls --version 0.3.0
NuGet\Install-Package XAvalonia.Controls -Version 0.3.0
<PackageReference Include="XAvalonia.Controls" Version="0.3.0" />
<PackageVersion Include="XAvalonia.Controls" Version="0.3.0" />
<PackageReference Include="XAvalonia.Controls" />
paket add XAvalonia.Controls --version 0.3.0
#r "nuget: XAvalonia.Controls, 0.3.0"
#:package XAvalonia.Controls@0.3.0
#addin nuget:?package=XAvalonia.Controls&version=0.3.0
#tool nuget:?package=XAvalonia.Controls&version=0.3.0
XAvalonia
A plugin-based, extensible desktop shell framework built on Avalonia UI β inspired by Gemini for WPF, reimagined for cross-platform .NET.
What is XAvalonia?
XAvalonia is a shell framework for building extensible desktop applications on top of Avalonia UI. It provides the plumbing β docking layout, menus, status bar, panels, documents β so that each feature of your application lives in an isolated, self-describing plugin.
The architecture is directly inspired by the Eclipse/Gemini model:
- The shell owns the window, the dock, and the service bus.
- Plugins discover each other at runtime, register services, and contribute UI via a clean contribution API.
- Your
Program.csis a single line.
[STAThread]
public static void Main(string[] pArgs) => ShellApplication.Run(pArgs);
Features
| π§© Plugin system | Runtime assembly scanning, two-phase lifecycle, automatic dependency tracking |
| πͺ Docking layout | Full dock/float/split via Dock.Avalonia |
| π Document tabs | Open, activate, and close tabbed documents from any plugin |
| π§ Tool panels | Register Left / Right / Bottom / Top panels dynamically |
| π Menu contributions | Add top-level menus and items with commands, icons, and keyboard shortcuts |
| π Status bar | Left/right aligned items, updated at runtime |
| βοΈ Configuration | Declarative JSON binding via [TechConfiguration] / [UserConfiguration] attributes |
| ποΈ Settings editor | VS Code-style editor (File βΊ Settingsβ¦) for every [UserConfiguration] property: category tree, search, live save |
| π§Ύ PropertyInspector | Reusable property list control; plugins register editors per data type via IPropertyEditorRegistry |
| π NuGet update checks | Plugins can expose a NuGetPackageId for live update detection |
| π¦ DI built-in | Microsoft.Extensions.DependencyInjection throughout |
| π¨ Fluent theme | Avalonia Fluent Dark theme out of the box |
Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β XAvalonia.SampleApp β
β (entry point β 1 line) β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β XAvalonia.Bootstrap β
β ShellApplication Β· PluginLoader Β· PluginManager Β· Services β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β depends on
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β XAvalonia.Shell.Abstractions β
β IPlugin Β· IMenuService Β· IDocumentService Β· IToolPanelService β
β IStatusBarService Β· IMainWindowService Β· ILogService β¦ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β²
ββββββββββββββΌβββββββββββββ
β β β
βββββββββββ΄βββ ββββββββ΄ββββββ ββββ΄βββββββββββ
β MainWindow β βPluginBrowserβ β YourPlugin β
β Plugin β β Plugin β β (future) β
ββββββββββββββ ββββββββββββββ ββββββββββββββ-β
Plugins only ever reference XAvalonia.Shell.Abstractions β zero coupling to the framework internals.
Default layout
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β File View Help β β Menu bar
ββββββββββββ¬βββββββββββββββββββββββββββ¬ββββββββββββββββ€
β β [ Doc 1 ] [ Doc 2 ] β¦ β β
β ββββββββββββββββββββββββββββ€ β
β Explorer β Document contentβ¦ β Properties β
β ββββββββββββββββββββββββββββ€ β
β β Output β β
β β [INFO] Application β¦ β β
ββββββββββββ΄βββββββββββββββββββββββββββ΄ββββββββββββββββ€
β Ready No file open Ln 1 β β Status bar
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Getting Started
Prerequisites
Run the sample app
git clone https://github.com/your-org/xavalonia.git
cd xavalonia
dotnet run --project XAvalonia.SampleApp
Writing a Plugin
A plugin is a class library that references only XAvalonia.Shell.Abstractions.
1. Implement IPlugin
public sealed class HelloPlugin : IPlugin
{
public string Id => "com.example.hello";
public string Name => "Hello Plugin";
public string Description => "A minimal XAvalonia plugin.";
public Version CurrentVersion => new(1, 0, 0);
public string? NuGetPackageId => null;
public IReadOnlyList<Type> ProvidedServices => [];
public void RegisterServices(IServiceCollection pServices)
{
pServices.AddSingleton<HelloDocumentViewModel>();
}
public void Initialize(IPluginServiceManager pServiceManager)
{
IMenuService lMenus = pServiceManager.RequestService<IMenuService>();
IDocumentService lDocs = pServiceManager.RequestService<IDocumentService>();
lMenus.RegisterMenuItem("menu.file", new MenuItemContribution
{
Id = "menu.file.hello",
Header = "_Hello World",
Order = 100,
Command = ReactiveCommand.Create(() =>
lDocs.RegisterDocument(new DocumentContribution
{
Id = "doc.hello",
Title = "Hello",
ViewModel = pServiceManager.RequestService<HelloDocumentViewModel>()
}))
});
}
}
2. Drop the DLL into the plugins directory
Point pluginsDirectory in technical_configuration.json to the folder containing your plugin's output.
XAvalonia scans all assemblies at startup β no manual registration required.
{
"pluginsDirectory": "C:\\MyApp\\Plugins"
}
3. Follow the View convention
The ViewLocator resolves views by naming convention:
| ViewModel | β View |
|---|---|
My.Plugin.ViewModels.HelloDocumentViewModel |
My.Plugin.Views.HelloDocumentView |
Project Structure
XAvalonia/
βββ XAvalonia.Shell.Abstractions/ β Plugin contract (no UI deps)
βββ XAvalonia.Bootstrap/ β Framework core & services
βββ XAvalonia.Controls/ β Shared controls (PropertyInspector)
βββ XAvalonia.MainWindow/ β Default dock layout plugin
βββ XAvalonia.SampleApp/ β Minimal entry-point app
βββ Plugins/
βββ XAvalonia.PluginBrowser/ β Browse & update plugins
βββ XAvalonia.LogViewer/ β Output panel
βββ XAvalonia.UserSettings/ β Settings editor (user configuration)
βββ XAvalonia.Splashscreen/ β Startup splash screen
Key Dependencies
| Package | Version | Role |
|---|---|---|
| Avalonia | 11.3 | Cross-platform UI framework |
| Dock.Avalonia | 11.3 | Docking layout engine |
| CommunityToolkit.Mvvm | 8.4 | MVVM source generators |
| Microsoft.Extensions.DependencyInjection | 8.0 | IoC container |
Roadmap
- Add a screenshot / GIF demo
- NuGet package for
XAvalonia.Shell.Abstractions - Theming API (light / dark / custom)
- Plugin marketplace integration
- Persistent user layout per plugin
Acknowledgements
Inspired by Gemini β the excellent WPF shell framework by @tgjones. XAvalonia brings the same plugin-first philosophy to cross-platform desktop development via Avalonia UI.
License
MIT β see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. 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. |
-
net8.0
- Avalonia (>= 11.3.11)
- Avalonia.Themes.Fluent (>= 11.3.11)
- XAvalonia.Shell.Abstractions (>= 0.3.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on XAvalonia.Controls:
| Package | Downloads |
|---|---|
|
XAvalonia.Bootstrap
XAvalonia shell bootstrap β plugin loader, lifecycle manager, DI wiring, and core service implementations. |
|
|
XAvalonia.UserSettings
XAvalonia settings editor plugin β browse, search and edit the user configuration declared by plugins, in the spirit of the Visual Studio Code settings editor. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.3.0 | 122 | 10/13/2026 |