MAUI怎么共享代码给WPF MAUI与WPF代码复用

来源:这里教程网 时间:2026-02-21 17:37:23 作者:

MAUI 和 WPF 是两个独立的 UI 框架,**不能直接共享 UI 层代码**(比如 XAML 页面、控件逻辑),但**业务逻辑、数据模型、服务、工具类等非 UI 代码完全可以复用**。关键在于项目结构设计和分层隔离。

核心原则:把可复用的部分抽离到 .NET Standard 或 .NET 6+ 类库

MAUI(.NET 6+)和 WPF(.NET 6+)都支持面向 .NET Standard 2.1 或更推荐的 .NET 6 及以上类库(net6.0 / net7.0 / net8.0)。只要不引用任何 UI 相关的命名空间(如

Microsoft.Maui
System.Windows
),就能被两边共用。

新建一个 Class Library(.NET 6) 项目(例如
MyApp.Core
把 ViewModel、Model、Repository、HttpClient 封装、DTO、Extensions、INotifyPropertyChanged 实现等放进去 MAUI 项目和 WPF 项目都通过
ProjectReference
引用它
确保该类库的
<targetframework></targetframework>
net6.0
或更高(兼容两者)

ViewModel 层可以 100% 复用(推荐 MVVM)

只要 ViewModel 不依赖 UI 框架(比如不用

Dispatcher
Application.Current
Navigation
等),它在 MAUI 和 WPF 中行为一致。

INotifyPropertyChanged
+ 手动触发或用 CommunityToolkit.Mvvm 的
[ObservableProperty]
命令用
ICommand
RelayCommand
(来自 Toolkit),WPF 和 MAUI 都支持绑定
避免在 ViewModel 里写导航逻辑(如
Shell.GoToAsync
NavigationService.Navigate
),改用事件或回调通知宿主页面处理

共享数据访问与服务(如 API 调用、本地存储)

HTTP 客户端、JSON 序列化、SQLite 封装、设置管理等,只要不调用平台特定 API,就能共用。

定义统一接口(如
IDataService
ISettingsService
)放在共享类库中
具体实现(如基于
HttpClient
的 API 客户端)也放共享库 ——
HttpClient
在 .NET 6+ 是跨平台的
平台差异部分(如 WPF 用
IsolatedStorage
,MAUI 用
Preferences
)通过依赖注入在各自 UI 项目中注册实现

小技巧:用条件编译处理极少数平台差异

极个别场景(比如日志写入路径、临时文件夹)需要区分平台,可用

#if
预处理器指令,但要克制使用:

在共享项目中添加
DefineConstants
,例如 WPF 项目加
WPF
,MAUI 项目加
MAUI
代码中:#if WPF ... #elif MAUI ... #endif 仅用于常量、简单路径拼接等轻量逻辑;复杂逻辑仍建议用接口 + DI

基本上就这些。不复杂,但容易忽略分层边界 —— 记住:UI 是不可共享的,其余大都可以。从第一天就建好 Core 类库,后面扩展 WinForms、Android 或 iOS 也会很轻松。

相关推荐