Avalonia通过RuntimePlatform常量、条件编译、依赖注入和平台资源字典实现跨平台适配。例如用RuntimePlatform.IsMacOS调整窗口装饰,用#if区分托盘图标实现,用DI注册平台专属服务,或在XAML中按条件加载样式。

Avalonia 支持跨平台开发,但有时需要为不同操作系统(如 Windows、macOS、Linux)编写特定逻辑或 UI 行为。它不提供类似 Xamarin 的 OnPlatform XAML 语法,但有更灵活、更符合 .NET 生态的方式实现平台特定代码。
使用 Avalonia 的 RuntimePlatform 检测当前平台
最直接的方式是通过 Avalonia.Application.Current.ApplicationLifetime 或静态属性 Avalonia.Threading.Dispatcher.UIThread.InvokeAsync 中检查运行时平台:
RuntimePlatform.IsWindowsRuntimePlatform.IsMacOSRuntimePlatform.IsLinux
这些是编译时已知的常量(基于目标框架),适合在初始化、资源加载、窗口行为等场景做轻量判断。例如:
if (RuntimePlatform.IsMacOS)
{
mainWindow.ExtendClientAreaToDecorationsHint = true;
mainWindow.SystemDecorations = SystemDecorations.None;
}用条件编译(#if)分离平台专用实现
对于差异较大、涉及 P/Invoke、原生 API 调用或平台专属服务(如通知、托盘图标),推荐用 C# 条件编译:
- 在项目文件中为不同平台定义符号(如
)$(DefineConstants);MACOS - 或依赖 SDK 自动定义:
WINDOWS、MACOS、LINUX(Avalonia SDK 默认启用)
然后在代码中:
#if WINDOWS var tray = new WinTrayIcon(); #elif MACOS var tray = new MacTrayIcon(); #elif LINUX var tray = new LinuxTrayIcon(); #endif
通过依赖注入注册平台专用服务
更推荐的架构方式:定义统一接口(如 INotificationService),并在 AppBuilder 配置阶段按平台注册不同实现:
婚纱影楼小程序提供了一个连接用户与影楼的平台,相当于影楼在微信的官网。它能帮助影楼展示拍摄实力,记录访客数据,宣传优惠活动。使用频率高,方便传播,是影楼在微信端宣传营销的得力助手。功能特点:样片页是影楼展示优秀摄影样片提供给用户欣赏并且吸引客户的。套系页是影楼根据市场需求推出的不同套餐,用户可以按照自己的喜好预定套系。个人中心可以查看用户预约的拍摄计划,也可以获取到影楼的联系方式。
var builder = AppBuilder.Configure() .UsePlatformDetect() .SetupWithoutStarting(); if (RuntimePlatform.IsWindows) builder.Services.AddSingleton
(); else if (RuntimePlatform.IsMacOS) builder.Services.AddSingleton (); else builder.Services.AddSingleton (); builder.Start();
这样业务逻辑完全解耦,测试和维护更清晰。
平台特定资源与样式(XAML 层)
Avalonia 不支持 XAML 内联平台判断,但可通过以下方式适配:
- 在
App.xaml中按需Merge不同平台的资源字典(如Styles.Windows.xaml) - 用
Style Selector+ 自定义IStyleSelector在运行时切换样式 - 对控件属性绑定一个平台感知的 ViewModel 属性(如
IsMacOs => IsTransparentBackground = true)
例如,在窗口 XAML 中:
注意:platform: 需在 XAML 命名空间中声明:xmlns:platform="using:Avalonia"。









