name: dotnet-ui-chooser description: “选择 .NET UI 框架。跨越 Blazor、MAUI、Uno、WinUI、WPF、WinForms 的决策树。”
dotnet-ui-chooser
为 .NET 应用程序选择的 UI 框架决策树。覆盖 Web(Blazor Server、Blazor WebAssembly、Blazor Hybrid)、跨平台(MAUI、Uno Platform、Avalonia)和仅 Windows(WinUI 3、WPF、WinForms)的框架。呈现结构化权衡分析,跨越五个决策因素,帮助团队根据其特定约束评估选项。
范围
- 框架选择决策树(目标平台、团队技能、性能、生态系统)
- 跨框架比较表格
- Web、跨平台和仅 Windows 框架的权衡分析
范围外
- 框架特定实现模式 – 参见以下列出的个别技能
- 框架间迁移路径 – 参见 [skill:dotnet-wpf-migration]
- 桌面 UI 测试 – 参见 [skill:dotnet-ui-testing-core]
交叉引用:[skill:dotnet-blazor-patterns] 用于 Blazor 托管和渲染模式,[skill:dotnet-maui-development] 用于 MAUI 模式,[skill:dotnet-uno-platform] 用于 Uno Platform 模式,[skill:dotnet-winui] 用于 WinUI 3 模式,[skill:dotnet-wpf-modern] 用于 .NET 8+ 上的现代 WPF,[skill:dotnet-winforms-basics] 用于 WinForms 现代化。
决策树
使用此结构化流程,根据项目约束缩小框架选择范围。每个分支呈现权衡而非确定答案 – 正确选择取决于团队为每个因素分配的权重。
步骤 1:目标平台
最重要的约束。确定应用程序必须支持哪些平台。
目标平台?
|
+-- 仅 Web 浏览器
| --> Blazor(Server、WebAssembly 或 Auto)
| 参见下面的“Blazor 托管模型选择”
|
+-- 仅 Windows
| --> WinUI 3、WPF 或 WinForms
| 参见下面的“Windows 框架选择”
|
+-- 移动(iOS / Android)
| +-- 也需要桌面?
| | +-- 是 --> MAUI 或 Uno Platform
| | +-- 否 --> MAUI 或 Uno Platform
| |
| +-- 也需要 Web?
| +-- 是 --> Uno Platform(WASM 目标)或 MAUI 中的 Blazor Hybrid
| +-- 否 --> MAUI 或 Uno Platform
|
+-- 所有平台(Web + 移动 + 桌面)
| --> Uno Platform(最广覆盖)
| 或 MAUI 中的 Blazor Hybrid(Web UI,原生外壳)
|
+-- 桌面跨平台(Windows + macOS + Linux)
--> Uno Platform 或 Avalonia
MAUI 支持 macOS/Windows 但不支持 Linux
步骤 2:团队专长
匹配框架到现有团队技能,以减少上手时间。
| 团队优势 | 强匹配 | 中等匹配 | 学习曲线较陡 |
|---|---|---|---|
| WPF / WinUI XAML | WPF, WinUI 3 | Uno Platform(WinUI XAML 表面) | Blazor(Razor 语法) |
| Web(HTML/CSS/JS) | Blazor | Uno Platform(WASM 目标) | WPF, WinUI(XAML) |
| Xamarin.Forms | MAUI(直接继承者) | Uno Platform | Blazor, WPF |
| C# 但无 UI 框架 | WinForms(最简单)、Blazor | MAUI | WPF, WinUI(XAML 学习曲线) |
| React / Angular | Blazor WebAssembly(SPA 模型) | Uno Platform(WASM) | WPF, WinUI |
步骤 3:UI 复杂度
匹配 UI 需求到框架渲染能力。
| UI 需求 | 最佳匹配 | 也可考虑 |
|---|---|---|
| 丰富的原生 Windows UI(自定义控件、动画) | WinUI 3, WPF | Uno Platform(WinUI 表面) |
| Web 风格布局(响应式、CSS 基础) | Blazor | Uno Platform(Skia 渲染) |
| 简单数据输入表单、内部工具 | WinForms | Blazor(静态 SSR)、WPF |
| 像素完美跨平台 UI | Uno Platform(Skia 渲染) | Avalonia |
| 每个操作系统的平台原生外观 | MAUI(原生控件) | Uno Platform(原生模式) |
| 桌面/移动应用中的嵌入式 Web 内容 | MAUI 中的 Blazor Hybrid | WPF/WinForms 中的 Blazor Hybrid |
步骤 4:性能需求
框架渲染架构影响性能特征。
| 性能因素 | WinUI 3 | WPF | WinForms | Blazor Server | Blazor WASM | MAUI | Uno Platform |
|---|---|---|---|---|---|---|---|
| 启动时间 | 快 | 快 | 快 | 快(服务器) | 慢(下载) | 中等 | 中等 |
| 渲染 | DirectX(原生) | DirectX(托管) | GDI+ | 服务器端 HTML | 浏览器 DOM | 平台原生 | Skia 或原生 |
| AOT 支持 | 不适用(Windows) | 不适用(Windows) | 不适用(Windows) | 不适用(服务器) | 是(.NET 8+) | 是(iOS 必需) | 是(WASM) |
| GPU 加速 | 是 | 是 | 有限 | 不适用 | 浏览器 GPU | 平台 GPU | Skia GPU |
| 每用户内存 | 仅本地 | 仅本地 | 仅本地 | 服务器电路 | 浏览器沙箱 | 仅本地 | 仅本地 |
| 离线能力 | 是 | 是 | 是 | 否 | 是 | 是 | 是(原生目标) |
步骤 5:迁移路径
如果现代化现有应用程序,源框架限制可行目标。
| 当前框架 | 自然目标 | 替代目标 | 决策因素 |
|---|---|---|---|
| UWP | WinUI 3 | Uno Platform | 仅 Windows: WinUI 3。需要跨平台: Uno Platform。 |
| Xamarin.Forms | MAUI | Uno Platform | 直接 API 继承者: MAUI。更广平台覆盖: Uno Platform。 |
| WPF(.NET Framework) | .NET 8+ 上的 WPF | WinUI 3 或 Uno Platform | 最小风险: WPF .NET 8+。现代 UI: WinUI 3。跨平台: Uno Platform。 |
| WinForms(.NET Framework) | .NET 8+ 上的 WinForms | Blazor 或 WPF | 最小风险: WinForms .NET 8+。更好 UI: WPF。Web 交付: Blazor。 |
| ASP.NET MVC / Razor Pages | Blazor(静态 SSR) | 保持 Razor Pages | 交互需求: Blazor。内容重: Razor Pages 仍然有效。 |
| React / Angular SPA | Blazor WebAssembly | 保持现有 SPA | 仅 .NET 团队: Blazor。现有 JS 团队: 保持 SPA。 |
Blazor 托管模型选择
当 Blazor 是目标时,根据交互需求、部署约束和规模选择托管模型。
| 关注点 | 静态 SSR | InteractiveServer | InteractiveWebAssembly | InteractiveAuto | Blazor Hybrid |
|---|---|---|---|---|---|
| 交互性 | 仅表单 | 完全 | 完全(下载后) | 完全 | 完全(原生) |
| 服务器必需 | 是(渲染) | 是(持久电路) | 仅静态文件主机 | 是(初始),然后静态 | 否 |
| 离线 | 否 | 否 | 是 | 部分 | 是 |
| 可扩展性 | 高 | 电路有限 | 高 | 高(WASM 后) | 不适用(本地) |
| 首次绘制 | 快 | 快 | 慢(WASM 下载) | 快(服务器优先) | 即时 |
| SEO | 是 | 预渲染 | 预渲染 | 预渲染 | 不适用 |
| 最适合 | 内容网站、简单表单 | 仪表板、LOB 应用 | 公共应用、离线 PWA | 两全其美 | 桌面/移动带 Web UI |
详细 Blazor 模式,参见 [skill:dotnet-blazor-patterns]。
Windows 框架选择
当应用程序仅目标 Windows 时,根据 UI 丰富度、团队专长和现代化目标选择。
比较表格
| 关注点 | WinUI 3 | WPF(.NET 8+) | WinForms(.NET 8+) |
|---|---|---|---|
| UI 范式 | 现代 XAML、Fluent Design | 经典 XAML、可选 Fluent(.NET 9+) | 设计器驱动、拖放 |
| 渲染 | DirectX(Windows App SDK) | DirectX(WPF 层) | GDI+ |
| MVVM 支持 | CommunityToolkit.Mvvm | CommunityToolkit.Mvvm、成熟生态系统 | 可能但不习语 |
| DI / Host builder | 是 | 是 | 是(.NET 8+) |
| 高 DPI | 原生 | .NET 8+ 改进 | PerMonitorV2(需要配置) |
| 暗模式 | 原生 Fluent | Application.ThemeMode(.NET 9+) | 实验性(.NET 9+) |
| 触摸/笔 | 完全支持 | 基本支持 | 有限 |
| 学习曲线 | 中等(XAML) | 中等(XAML) | 低 |
| 成熟度 | 较新(2021+) | 非常成熟(2006+) | 非常成熟(2002+) |
| UWP 迁移路径 | 直接 | 间接(XAML 差异) | 不适用 |
何时选择每个
WinUI 3 – 最适合需要现代 Fluent Design、触摸/笔输入和最新 Windows 集成(小组件、通知、Mica)的新 Windows 原生应用。要求 Windows 10 2004+。参见 [skill:dotnet-winui]。
WPF on .NET 8+ – 最适合有现有 WPF 专长的团队、需要丰富 WPF 控制生态系统的应用,或从 .NET Framework 迁移 WPF 的项目。Fluent 主题在 .NET 9+ 可用。参见 [skill:dotnet-wpf-modern]。
WinForms on .NET 8+ – 最适合快速原型、内部工具、简单 CRUD 表单和 Windows 实用程序,其中开发速度比 UI 抛光更重要。最简单学习曲线。参见 [skill:dotnet-winforms-basics]。
跨平台框架选择
当应用程序必须在多个平台上运行时,比较覆盖范围、渲染模型和 API 表面。
比较表格
| 关注点 | MAUI | Uno Platform | Avalonia |
|---|---|---|---|
| 目标平台 | iOS, Android, macOS, Windows, Tizen | iOS, Android, macOS, Windows, Linux, Web(WASM) | iOS, Android, macOS, Windows, Linux, Web(WASM) |
| UI 渲染 | 平台原生控件 | Skia(像素完美)或平台原生 | Skia(像素完美) |
| XAML 方言 | MAUI XAML(Xamarin.Forms 继承者) | WinUI XAML 表面 | Avalonia XAML(WPF 启发) |
| 热重载 | XAML + C# 热重载 | XAML + C# 热重载 | XAML 热重载 |
| 维护者 | Microsoft(第一方) | Uno Platform(开源,商业支持) | 社区(开源,商业支持) |
| 生态系统 | NuGet + MAUI 社区工具包 | NuGet + Uno 工具包 + Uno 扩展 | NuGet + Avalonia 社区 |
| Blazor Hybrid | 内置(BlazorWebView) | 支持 | 未内置 |
| Linux 桌面 | 不支持 | 支持(Skia + GTK/Framebuffer) | 支持 |
| Web(WASM) | 不支持 | 支持 | 支持(浏览器) |
| 迁移自 | Xamarin.Forms(直接) | UWP(直接 WinUI 表面) | WPF(类似 XAML) |
何时选择每个
MAUI – 最适合以移动为先的应用,目标 iOS 和 Android,可选 Windows/macOS 支持。平台原生控件提供操作系统原生外观和感觉。从 Xamarin.Forms 的直接迁移路径。参见 [skill:dotnet-maui-development]。
Uno Platform – 最需要最广平台覆盖(包括 Linux 和 Web)的应用,使用单一 XAML 代码库。使用 WinUI XAML API 表面,使其成为 UWP 或 WinUI 团队跨平台的天然路径。参见 [skill:dotnet-uno-platform]。
Avalonia – 社区驱动的跨平台框架,具有 WPF 启发的 XAML。强 Linux 桌面支持。当偏好 WPF 风格开发且可接受社区维护工具时考虑。此插件不拥有 – 参见 Avalonia 文档 获取详情。
权衡摘要矩阵
所有框架的合并视图,供快速参考。
| 框架 | 平台 | 渲染 | XAML | 离线 | AOT | 最适合 |
|---|---|---|---|---|---|---|
| Blazor Server | Web | 服务器 HTML | Razor | 否 | 不适用 | LOB 应用、仪表板 |
| Blazor WASM | Web | 浏览器 DOM | Razor | 是 | 是 | 公共 Web 应用、PWA |
| Blazor Hybrid | 移动 + 桌面 | WebView | Razor | 是 | 部分 | Web UI 在原生外壳中 |
| MAUI | 移动 + 桌面 | 原生 | MAUI XAML | 是 | iOS 必需 | 以移动为先的应用 |
| Uno Platform | 所有 | Skia / 原生 | WinUI XAML | 是 | WASM | 最广覆盖 |
| Avalonia | 桌面 + 移动 | Skia | Avalonia XAML | 是 | 部分 | Linux 桌面、WPF 团队 |
| WinUI 3 | Windows | DirectX | WinUI XAML | 是 | 不适用 | 现代 Windows 应用 |
| WPF | Windows | DirectX | WPF XAML | 是 | 不适用 | 成熟 Windows 应用 |
| WinForms | Windows | GDI+ | 无(设计器) | 是 | 不适用 | 内部工具、原型 |
常见决策场景
针对常见情况的结中指导。每个场景呈现权衡而非单一答案。
场景:新的内部业务应用(仅 Windows 用户)
- 快速交付,最小 UI: WinForms
- 丰富 UI 带数据可视化: WPF 或 WinUI 3
- 首选 Web 部署: Blazor Server(InteractiveServer)
- 未来跨平台可能性: Uno Platform 或 Blazor
场景:面向客户的移动应用
- iOS + Android,原生外观: MAUI
- iOS + Android + Web: Uno Platform 或 MAUI 中的 Blazor Hybrid
- 现有 Web 团队: MAUI 中的 Blazor Hybrid
场景:现代化遗留 .NET Framework WPF 应用
- 最小干扰: 迁移 WPF 到 .NET 8+(相同 XAML,现代运行时)
- 现代 UI 刷新(仅 Windows): 迁移到 WinUI 3
- 需要跨平台: 迁移到 Uno Platform(WinUI XAML 表面)
- 需要 Web 交付: 重写关键流程在 Blazor 中
场景:面向公众的 Web 应用
- 内容重,SEO: Blazor 静态 SSR
- 交互 SPA: Blazor WebAssembly 或 InteractiveAuto
- 实时仪表板: Blazor Server(InteractiveServer)
场景:目标 Windows、macOS 和 Linux 的桌面应用
- 像素完美 UI: Uno Platform(Skia)或 Avalonia
- MAUI 不支持 Linux 桌面
代理注意事项
- 不要推荐单一框架为“最佳”。 每个框架都有权衡。呈现选项和权衡,让团队根据其约束决定。
- 不要为新的面向客户应用推荐 WinForms。 WinForms 适用于内部工具和原型,但缺乏面向客户产品的现代 UI 能力。
- 不要混淆 MAUI 与 Uno Platform 目标覆盖。 MAUI 不支持 Linux 或 Web(WASM)。Uno Platform 支持。推荐前验证所需平台列表。
- 不要假定 Blazor WebAssembly 默认离线工作。 WASM 在浏览器中运行,但离线支持需要显式 PWA 配置(服务工作者、缓存策略)。
- 不要将 Avalonia 与 Microsoft 支持的框架混淆。 Avalonia 是社区维护的。它有商业支持选项但不是 Microsoft 产品。
- 不要建议将 UWP 直接迁移到 WPF。 UWP 的自然迁移目标是 WinUI 3(相同 XAML API 表面)。WPF 使用不同 XAML 方言。
- 不要忽视 Blazor Hybrid 作为跨平台选项。 MAUI 中的 Blazor Hybrid 允许 Web UI 技能应用于移动/桌面应用。它是学习原生 XAML 的可行替代。
- 不要假定 WPF 是遗留的。 .NET 8+ 上的 WPF 是积极维护的,具有新功能(.NET 9+ 中的 Fluent 主题、性能改进)。对于 Windows 桌面,它仍然是强选择。