MAUI和WPF不能共享UI层代码,但业务逻辑、数据模型、服务等非UI代码可复用;需通过.NET 6+类库隔离分层,ViewModel遵循MVVM且不依赖UI框架,数据访问与服务通过接口+DI实现跨平台兼容。
MAUI 和 WPF 是两个独立的 UI 框架,**不能直接共享 UI 层代码**(比如 XAML 页面、控件逻辑),但**业务逻辑、数据模型、服务、工具类等非 UI 代码完全可以复用**。关键在于项目结构设计和分层隔离。
MAUI(.NET 6+)和 WPF(.NET 6+)都支持面向 .NET Standard 2.1 或更推荐的 .NET 6 及以上类库(net6.0 / net7.0 / net8.0)。只要不引用任何 UI 相关的命名空间(如 Microsoft.Maui、System.Windows),就能被两边共用。
MyApp.Core)ProjectReference 引用它 是 net6.0 或更高(兼容两者)只要 ViewModel 不依赖 UI 框架(
比如不用 Dispatcher、Application.Current、Navigation 等),它在 MAUI 和 WPF 中行为一致。
INotifyPropertyChanged + 手动触发或用 CommunityToolkit.Mvvm 的 [ObservableProperty]
ICommand 或 RelayCommand(来自 Toolkit),WPF 和 MAUI 都支持绑定Shell.GoToAsync 或 NavigationService.Navigate),改用事件或回调通知宿主页面处理HTTP 客户端、JSON 序列化、SQLite 封装、设置管理等,只要不调用平台特定 API,就能共用。
IDataService、ISettingsService)放在共享类库中HttpClient 的 API 客户端)也放共享库 —— HttpClient 在 .NET 6+ 是跨平台的IsolatedStorage,MAUI 用 Preferences)通过依赖注入在各自 UI 项目中注册实现极个别场景(比如日志写入路径、临时文件夹)需要区分平台,可用 #if 预处理器指令,但要克制使用:
DefineConstants,例如 WPF 项目加 WPF,MAUI 项目加 MAUI
基本上就这些。不复杂,但容易忽略分层边界 —— 记住:UI 是不可共享的,其余大都可以。从第一天就建好 Core 类库,后面扩展 WinForms、Android 或 iOS 也会很轻松。