如何为Xamarin Forms应用开发两套不同的前端UI界面
Xamarin Forms 多应用UI差异化实现最优方案
前置准备
先将所有非UI代码(包括ViewModel、业务服务、数据处理、工具类、公共接口等)完全抽离为独立的 .NET Standard 类库,所有应用的UI层统一引用该核心类库,从根源避免逻辑代码重复维护。
方案1:单解决方案 + 共享XAML项目 + 条件编译(适合UI差异较小的场景)
- 把所有XAML文件(含AppShell)统一放到共享项目(Shared Project) 中,共享项目原生支持条件编译,比.NET Standard类库更适合做多版本UI差异化
- 在同一个解决方案中新增第二套iOS、Android原生头项目,分别对应新应用;在两套原生项目的属性配置中分别添加专属编译常量,例如旧应用加
APP_OLD,新应用加APP_NEW - XAML层面的差异化可以通过以下方式实现:
- 全局样式、主题差异:编写两套ResourceDictionary,在App.xaml.cs中通过编译常量判断加载对应资源文件
- 页面级差异:小差异直接用编译常量包裹对应XAML后端逻辑,大差异可以用编译常量加载完全不同的XAML页面
- 原生配置差异:两套原生项目各自维护自己的包名、图标、权限、上架配置,互不干扰
- App Centre中可以直接配置不同的编译目标,分别对应两套应用的发布任务,无需处理项目卸载、多解决方案同步的问题
方案2:单解决方案 + 独立UI项目(适合UI差异极大、几乎无XAML复用的场景)
- 核心逻辑还是复用抽离出来的.NET Standard公共类库
- 在同一个解决方案中新建第二个独立的Xamarin Forms UI项目,专门存放新应用的所有XAML代码;再新增第二套iOS、Android原生头项目,只引用对应自己的UI项目,和旧应用的项目引用完全隔离
- 编译发布时仅需切换启动项目即可,App Centre中可以分别给两套应用配置对应的编译路径和目标,完全不需要维护两个独立的解决方案,也不会出现项目引用冲突
原方案的问题
你目前规划的双解决方案+双XAML项目的模式,后续维护公共逻辑、依赖版本、配置参数时需要两边同步,很容易出现不一致的问题,维护成本比单解决方案高很多。
内容的提问来源于stack exchange,提问作者ThirdPrize
相关产品推荐
相关产品推荐

