avalonia是真正跨平台的c# ui框架,一份代码可运行于windows、macos、linux(wayland/x11),而wpf仅限windows,winforms跨平台体验差;它非wpf平替,而是重实现,xaml语法、控件命名及行为均有差异。

为什么不用WPF或WinForms直接上Avalonia
Avalonia是真正意义上的跨平台UI框架,编译后一份代码能跑在Windows、macOS、Linux(包括Wayland/X11)上,而WPF仅限Windows,WinForms在macOS/Linux上靠Mono支持但体验差、维护弱。如果你明确需要“写一次、到处部署”的桌面应用,且不依赖Windows专属API(如UWP控件、COM组件),Avalonia就是当前C#生态里最务实的选择。
注意:它不是WPF的“平替”,而是重实现——AvaloniaXamlLoader解析的是Avalonia专属XAML语法,Window类来自Avalonia.Controls而非System.Windows,控件命名和行为也有差异(比如TextBox默认不触发TextChanged直到失去焦点,需设TextBindingMode=TwoWay并监听Text属性变化)。
用dotnet CLI快速创建Avalonia项目
别打开Visual Studio点新建项目——模板可能过时或缺平台支持。推荐用命令行确保环境干净:
- 先确认已安装.NET 6+ SDK(Avalonia 11要求.NET 6,12起要求.NET 8)
- 运行:
dotnet tool install -g avalonia-cli - 然后:
avalonia new MyDesktopApp --target-framework net8.0 - 生成的项目含
Program.cs(初始化BuildAvaloniaApp())、App.xaml和主窗口MainWindow.xaml
关键点:BuildAvaloniaApp()必须在Main()中调用,且不能被await阻塞;若需异步初始化(如加载配置),得在OnFrameworkInitializationCompleted回调里做,否则窗口可能黑屏或无响应。
在Linux/macOS上运行前必须检查的三件事
Avalonia在非Windows平台容易卡在启动阶段,常见原因很具体:
-
libgl1和libxkbcommon0缺失(Ubuntu/Debian系):运行sudo apt install libgl1 libxkbcommon0 - Wayland会话下
GTK_LAYER_SHELL未启用(导致窗口无标题栏):启动时加环境变量GDK_BACKEND=wayland或改用X11会话 - 字体渲染异常(文字模糊/方块):确保系统有Noto Sans、DejaVu等开源字体,或在
App.xaml里显式设置FontFamily="Segoe UI, sans-serif"
调试建议:启动时加参数 --verbose,查看日志里是否报Failed to load library libSkiaSharp——这说明Skia渲染后端没找到对应so/dylib,需检查Avalonia.Skia.Linux或Avalonia.Skia.Gtk包是否引入正确。
绑定命令和数据时最容易漏掉的初始化
Avalonia的MVVM绑定不像WPF那样“自动激活”,INotifyPropertyChanged实现后还需手动注册:
- ViewModel类必须继承
ReactiveObject(来自Avalonia.ReactiveUI)或手动调用RaisePropertyChanged() - XAML中绑定命令需用
{Binding MyCommand},但前提是DataContext已设为ViewModel实例——常有人只在MainWindow.xaml.cs里this.DataContext = new MainViewModel();,却忘了在App.xaml.cs里调用AppBuilder.UseReactiveUI(),否则命令无法解析 - 若用
ObservableCollection<t></t>,记得引用Avalonia.Collections,原生System.Collections.ObjectModel不触发UI刷新
一个典型坑:Button点击后命令执行了,但界面没更新——大概率是ViewModel属性变更没走RaisePropertyChanged,或绑定路径写成{Binding Items.Count}(Avalonia不支持点号链式绑定,得用{Binding Items/Count})。










