.NET GUI 技术选型
本文会涉及跨平台的技术栈,但更侧重于 Windows 端。
横向看看
先说说当下 Windows 端使用最多的几种技术栈。
- Electron:基于 Web,天然跨平台且移植性好。有人说 Electron 性能差,但除非是对性能有极致追求,或者算法密集性应用,性能基本不是问题。痛点就是发布要带着一个 Chorminum,发布包 150 MB+,内存占用也高。 也可以用 Tauri 这个轻量框架,但是要学 Rust。
- WinUI 3:现在微软把“3”去掉了,直接叫 WinUI。微软在积极开发中,把它当成未来的主力。界面可属于“最现代”的一流。发布包比较大,100 MB+,7z 完也有 30MB+。
- WinForm / WPF:俩老炮,新项目就不要用 WinForm 了,WPF 还可以考虑。 这两个做出来的 UI 都不能算是“最现代”的,微软目前似乎只是维护着 WPF,加新功能和优化 UI 不是很积极。 不过 WPF 可以用 .NET 9 之后的 Fluent 主题,或者加一些第三方 UI 库,凑合着也行。发布包很小,1 MB+。
- Avalonia:类似 WPF,发布包稍大一点,但听说 Self-contain + AOT + Trim 之后很划算。但本人不知道为啥就是用不惯。
- Flutter:Google 开发的跨平台框架,国内配置开发环境有点难受,实测感觉构建有点慢。需要学 Dart,发布大小中规中矩,30 MB+。
- MAUI:如果你的程序只在 Windows 上跑,就不要用 MAUI。
- UWP / WinUI2:UI 性能也不错,但是必须要按 UWP 的方式发布,有点像围墙花园。不是很了解。
- Java:我不是很懂。感觉见的不多。
- C + Windows SDK:你是说你要自己写窗口过程和消息循环吗。
那很坐牢了。
结论是什么
如果你要用 .NET 开发一个 GUI 程序...
- 小程序 / 工具:如果只在 Windows 上跑,无脑选 WPF 就得。一般小程序不需要考虑跨平台,如果非要,可考虑 Avalonia、MAUI。注意 MAUI 不支持 Linux。
- 大型工具:如果你的软件复杂到“用户觉得体积 100 MB 也正常”,或者说“值得”占用用户的那么多磁盘空间,那就选 WinUI 3。这样可以轻松获得 WinUI 3 的现代外观。
- 你会 Web 开发:可以考虑 WebView2 或者 WebUI 前端 + ASP.NET 后端。这样又可以占到 Web 界面漂亮和 .NET 性能好的优势。
WPF vs Avalonia 和一些第三方库
主要看两个方面:
- 环境配置难度
- 社区支持度 / 社区资源
环境配置这方面,WPF 自然是最简单的,安装 .NET SDK 就行。Avalonia 需要装 NuGet,还有在 VS 里装一个扩展,略麻烦。其他第三方库嘛,通常是通过 NuGet 包分发,很愉快。
其实不太建议花太多精力折腾第三方库。使用之前先看看上次提交是什么时候,有多少 issue,上个 issue 是什么时候。我试过不少第三方库,空项目 demo 编译都出错,基本可以直接放弃了。
如果你确实很喜欢用第三方库,建议优先考虑 Avalonia,其第三方 UI 库比较多,且效果好。如果你想开发也是同理。这是因为 WPF 不太适合做复杂的动效之类的。
WPF vs WinUI 3
发布包的大小,前面提过了,WinUI 3 确实很大,开发小工具之类的就不要用了。
但是 WinUI 3 的界面还是很赞,很丝滑的。可以在 Microsoft Store 里下载 WinUI Gallery 体验,控件超多。
Fluent 支持
虽然 WPF 也支持 Fluent,但是动效远不如 WinUI 3 好。WPF 的 UI 会显得比较死板,不过也不算难看。比较突出的痛点是 ScrollView 滚动时是步进的,无动画。
不要期望 WPF 的 Fluent 会很现代。如果开箱即用,不自定义些什么的话,会很难受。
UI 性能?
这是比较津津乐道的地方了,网上或者 AI 可以搜出很多答案,不过我的观察好像和那些渠道所说的不太一样。
首先,UI 性能其实是一个宽泛的说法,WPF 和 WinUI 比较,我认为是各有所长。
-
大量数据:大家都说 WPF 绑定性能好,适合做监视大屏,同时加载很多数据。但是我也开发过一些需要绑定特别多数据的程序(还包括图片),这种情况下 UI 会直接卡死(同一时间更新的数据太多了)。应该是 Xaml 通病吧。这方面,远不如 React 之类性能好。不知道 WinUI 会不会也有此情况。
DeepSeek 说是有解决方案的,但是我没有仔细研究。它是这样说的:“可以用
VirtualizingStackPanel(虚拟化)+Dispatcher分批加载”。 -
动效:WPF 做动效,不知道为啥总感觉有点卡卡的。这里说的动效是比如鼠标 hover、按钮按下这类微动效。总之感觉 WPF 这快不太行(
也有可能是错觉吧)。而 WinUI 就很丝滑流畅,各种动效和细节拉满,很赞。 -
响应窗口尺寸变化:就是在窗口边缘拖动,改变窗口大小。在这一点上,WPF 就做的很好,窗口边缘稳稳焊在光标上,毫无卡顿,窗口的布局也响应的很及时。而 WinUI 就不行了,会掉帧。
发布方式 / Windows App SDK
使用 WinUI,其实就是选择了 Windows App SDK。
这意味着微软是推荐你用 .msix 或者 Microsoft Store 分发了。而这就意味着你需要对代码签名。申请证书需要成本,对于个 人开发者 / 兴趣项目就不太友好。
不过好在也是可以不打包,直接发布的。
使用 WinApp SDK 带来的一个额外好处,就是可以调用一些和操作系统相关的 API,这是 WPF 做不到的。比如 App Notification,就是右下角弹出来的那种消息。虽然 WinForm / WPF 也能做到,但比较简陋就是了。
DeepSeek 说:“WinUI 3 至今没有官方标准的 Tray Icon 控件,需要自己写 P/Invoke 调用 Win32 API,非常折磨。如果你的工具需要常驻后台托盘,WinUI 3 会让你痛不欲生。”
我没有考证过。
系统支持
如果要支持 Window7 和早期的 Windows10,那就必须选 WPF 了。