MAUI 本身不支持“同一资源名在不同平台自动切换文件”,但可以通过条件编译 + 平台专属资源路径 + 运行时判断,实现按平台加载不同资源文件。关键不是让一个资源“自动变”,而是让代码“有选择地用”。
用条件编译区分平台资源逻辑
在共享代码中,通过
#if指令控制资源加载路径或内容,是最直接、最可控的方式。
#if ANDROID:加载 Android 特定图标、字符串或配置文件路径
#if IOS:读取 iOS 沙盒内预置的 plist 或使用 Bundle.main 路径访问资源
#if WINDOWS:适配高 DPI 图标或 WinUI 风格字体映射 所有平台共用部分写在
#else或外层,保持默认行为
把平台专属资源放进 Platforms 文件夹
MAUI 项目结构天然支持平台隔离。你可以在
Platforms/Android/Resources/、
Platforms/iOS/Resources/等目录下放原生资源(如 Android 的
drawable-xxhdpi图片、iOS 的
Assets.xcassets),这些文件只参与对应平台构建,不会混入其他平台。 Android:可放
res/drawable下的图片,用
Android.App.Application.Context.GetDrawable(Resource.Drawable.xxx)获取 iOS:把图片拖进
Platforms/iOS/Resources,设置 Build Action 为
BundleResource,再用
UIImage.FromBundle("xxx")
Windows:放在 Platforms/Windows/Assets/,用
new BitmapImage(new Uri("ms-appx:///Assets/xxx.png"))
运行时动态选资源(适合字符串、JSON、配置)
当需要根据当前平台加载不同内容的文本、配置或 JSON 文件时,推荐用
FileSystem.OpenAppPackageFileAsync()配合命名约定。 把资源文件统一放在
Resources/Raw/下,命名为
config.android.json、
config.ios.json、
config.windows.json运行时用
DeviceInfo.Current.Platform.ToString().ToLower()拼出文件名 调用
await FileSystem.OpenAppPackageFileAsync($"Resources/Raw/config.{platform}.json")
注意:这些是只读打包资源,不能修改;如需写入,请改用 AppDataDirectory
图像多分辨率适配不等于“跨平台替换”
MAUI 的
Resources/Images多级目录(
Images/100、
Images/200、
Images/400)是为**同一平台内适配不同 DPI** 设计的,不是为跨平台切换。它不会因为你在 iOS 上运行就去读
Images/iOS/icon.png—— 这种目录结构 MAUI 不识别。 要真正“每平台一张图”,就得走上面的条件编译或
Platforms/xxx路径方案 图标、启动图等必须在各平台原生配置中单独设置(如 AndroidManifest.xml、Info.plist、Package.appxmanifest)
基本上就这些。不需要魔改构建流程,也不依赖第三方库,靠 MAUI 原生机制就能稳稳落地。
