关于 dotnet-ui-chooser
为 .NET 团队提供 UI 框架选择决策树,覆盖 Web、跨平台和 Windows 框架。通过平台、团队经验、界面复杂度、性能和迁移等因素比较取舍,不涉及各框架的实现细节。
主要功能
- 01按目标平台筛选框架
- 02比较团队技能适配度
- 03评估 UI 与性能需求
- 04梳理旧框架迁移选项
- 05选择 Blazor 托管模式
适用场景
- 01为新 .NET 应用选择 UI 框架
- 02比较 Windows 桌面框架
- 03评估移动端与 Web 覆盖范围
- 04规划旧 UI 应用现代化
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wshaddix/ dotnet-skills --skill dotnet-ui-chooser安装后在 Claude Code 中输入/dotnet-ui-chooser确认已加载。
详细介绍
dotnet-ui-chooser
面向 .NET 应用的 UI 框架选择决策树。涵盖 Web(Blazor Server、Blazor WebAssembly、Blazor Hybrid)、跨平台(MAUI、Uno Platform、Avalonia)以及仅限 Windows(WinUI 3、WPF、WinForms)框架。围绕五项决策因素提供结构化的权衡分析,帮助团队根据自身约束评估选项。
**范围边界:**此技能负责框架选择决策树和跨框架比较。各框架的深入内容、模式和 API 由对应的框架技能负责。框架之间的迁移指南由 [skill:dotnet-wpf-migration] 负责。
**范围之外:**框架特定的实现模式——请参阅下方列出的各项技能。框架之间的迁移路径——请参阅 [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:目标平台
这是影响最大的约束。确定应用必须支持哪些平台。
Target platforms?
|
+-- Web browser only
| --> Blazor (Server, WebAssembly, or Auto)
| See "Blazor Hosting Model Selection" below
|
+-- Windows only
| --> WinUI 3, WPF, or WinForms
| See "Windows Framework Selection" below
|
+-- Mobile (iOS / Android)
| +-- Also need desktop?
| | +-- Yes --> MAUI or Uno Platform
| | +-- No --> MAUI or Uno Platform
| |
| +-- Also need web?
| +-- Yes --> Uno Platform (WASM target) or Blazor Hybrid in MAUI
| +-- No --> MAUI or Uno Platform
|
+-- All platforms (web + mobile + desktop)
| --> Uno Platform (broadest reach)
| or Blazor Hybrid in MAUI (web UI, native shell)
|
+-- Desktop cross-platform (Windows + macOS + Linux)
--> Uno Platform or Avalonia
MAUI supports macOS/Windows but not 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(Static 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 支持 | N/A(Windows) | N/A(Windows) | N/A(Windows) | N/A(服务端) | 支持(.NET 8+) | 支持(iOS 上必需) | 支持(WASM) |
| GPU 加速 | 支持 | 支持 | 有限 | N/A | 浏览器 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) | WPF on .NET 8+ | WinUI 3 或 Uno Platform | 风险最低:WPF .NET 8+。现代 UI:WinUI 3。跨平台:Uno Platform。 |
| WinForms (.NET Framework) | WinForms on .NET 8+ | Blazor 或 WPF | 风险最低:WinForms .NET 8+。更好的 UI:WPF。通过 Web 交付:Blazor。 |
| ASP.NET MVC / Razor Pages | Blazor (Static SSR) | 保留 Razor Pages | 需要交互:Blazor。内容为主:Razor Pages 仍然适用。 |
| React / Angular SPA | Blazor WebAssembly | 保留现有 SPA | 仅使用 .NET 的团队:Blazor。现有 JS 团队:保留 SPA。 |
Blazor 托管模型选择
如果目标是 Blazor,请根据交互需求、部署限制和规模选择托管模型。
| 考量因素 | Static SSR | InteractiveServer | InteractiveWebAssembly | InteractiveAuto | Blazor Hybrid |
|---|---|---|---|---|---|
| 交互性 | 仅表单 | 完整 | 完整(下载后) | 完整 | 完整(原生) |
| 是否需要服务端 | 是(渲染) | 是(持久电路) | 仅静态文件主机 | 是(初始阶段),之后为静态 | 否 |
| 离线使用 | 否 | 否 | 是 | 部分支持 | 是 |
| 可扩展性 | 高 | 受电路限制 | 高 | 高(WASM 加载后) | 不适用(本地运行) |
| 首次绘制 | 快 | 快 | 慢(WASM 下载) | 快(先使用 Server) | 即时 |
| 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 layer) | 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 控件生态系统的应用,或从 WPF on .NET Framework 迁移的项目。.NET 9+ 提供 Fluent 主题。请参阅 [skill:dotnet-wpf-modern]。
WinForms on .NET 8+ -- 最适合快速原型开发、内部工具、简单 CRUD 表单,以及重视开发速度胜过 UI 精致度的 Windows 实用工具。学习曲线最简单。请参阅 [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 Community Toolkit | NuGet + Uno Toolkit + Uno Extensions | 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 用户使用)
- 快速交付,界面简洁:WinForms
- 丰富的界面和数据可视化: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,采用现代运行时)
- 更新为现代界面(仅限 Windows):迁移到 WinUI 3
- 需要跨平台:迁移到 Uno Platform(WinUI XAML 界面)
- 需要通过 Web 交付:使用 Blazor 重写关键流程
场景:面向公众的 Web 应用
- 内容为主,注重 SEO:Blazor Static SSR
- 交互式 SPA:Blazor WebAssembly 或 InteractiveAuto
- 实时仪表板:Blazor Server (InteractiveServer)
场景:面向 Windows、macOS 和 Linux 的桌面应用
- 像素级精准的界面:Uno Platform (Skia) 或 Avalonia
- MAUI 不支持 Linux 桌面
Agent 注意事项
- 不要推荐某个框架是“最佳选择”。 每个框架都有权衡。应介绍各方案及其权衡,并让团队根据自身限制做出决定。
- 不要为新的面向客户的应用推荐 WinForms。 WinForms 适用于内部工具和原型,但缺少面向客户产品所需的现代界面功能。
- 不要混淆 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 桌面,它仍是可靠的选择。