← 首页

WinForms 替代方案对比

Majorsilence.Forms 与 .NET MAUI、Avalonia、Uno Platform、Eto.Forms、WPF 和 Wine 的对比——每一种方案对现有 WinForms 代码库到底要求什么。

本页为译文。如与英文版有出入,以英文版为准。 English

如果你手上有一个能正常运行的 WinForms 应用,并且需要让它跑在 macOS 或 Linux 上,真正的问题 不是”哪个 UI 框架最好”,而是“我现有的代码能留下多少?”下面每一个选项都是好框架。只是 它们要求你付出的代码库比例差别极大。

一句话版本

选项 UI 范式 Linux macOS 移动 / Web 你现有的 WinForms 代码会怎样
Majorsilence.Forms WinForms(Form、控件、事件、设计器文件) 是(Avalonia 或 GTK 4) 是 浏览器(尚年轻)、Android 和 iOS(早期);还有终端 保留。更换命名空间 + 一个兼容层;迁移工具自动完成机械性部分。在 Windows 上还可以在现有 WinForms 或 WPF 应用内部一次一个控件地采用,包括 .NET Framework 4.8
Avalonia XAML + MVVM 是 是 是 重写为 XAML 视图和视图模型
Uno Platform WinUI XAML + MVVM 是 是 是 重写为 WinUI XAML
.NET MAUI XAML + MVVM 无官方支持 是(Mac Catalyst) 是 重写,并针对移动优先的控件集重新界定范围
Eto.Forms 自有的窗体风格 .NET API,每个操作系统使用原生部件 是 是 否 按 Eto 的 API 重写——形态相似,但与 WinForms 不是源码兼容
WPF XAML + MVVM 否 否 否 重写,而且仍然只支持 Windows
Wine 无——直接运行 Windows 二进制 是 是 否 原样不动,但你交付的是一个模拟运行的 Windows 应用,而不是原生应用

Majorsilence.Forms 本身就构建在其中几个之上

值得明说,因为这是一个常见的误读:Majorsilence.Forms 并不与 Avalonia、Uno Platform 或 GTK 竞争。 它使用它们。每个控件都由 Majorsilence.Forms 自己用 SkiaSharp 绘制,而底下的宿主——默认是 Avalonia,也可以是 Uno,或通过 gir.core 得到的真实 GTK 4 窗口——负责创建窗口、运行消息循环并 呈现 Skia 表面。在 Windows 上,同样的控件也可以改由真实的 System.Windows.Forms 或 WPF 窗口宿主, 这正是增量、原地迁移得以成立的原因。见平台后端。

所以选择题不是”Majorsilence.Forms 还是 Avalonia”。而是:你是直接写 Avalonia 的 XAML,还是继续写 WinForms,让 Avalonia(或 GTK 4、或 Uno)充当底层管道?

逐一分析

.NET MAUI

微软官方的 Xamarin.Forms 跨平台继任者,也是大多数搜索结果会给你的答案。对于全新的移动加 桌面应用,它是一个有力的选择。

但对现有的 WinForms 业务(LOB)应用来说,它通常是最难走的路:没有官方的 Linux 支持,控件集是 移动优先的(没有 DataGridView 的对应物,窗口和对话框模型也不同),每个界面都要用 XAML 重建, 还要加一层你的 WinForms 代码几乎肯定没有的视图模型。*.Designer.cs 文件没有任何有意义的复用。

Avalonia

成熟、真正跨平台的 XAML 框架——桌面、移动和 WebAssembly——Linux 支持出色,使用 Skia 渲染器。 如果你想要一套现代的 XAML 技术栈,并且准备好重写 UI 层,这是最有力的通用答案,也是 Majorsilence.Forms 默认运行其上的宿主。

注意 Avalonia 的商业产品 XPF 是面向 WPF 的兼容层,不是 WinForms;它对 System.Windows.Forms 代码库没有帮助。

Uno Platform

在桌面、移动和 WebAssembly 上实现 WinUI/UWP XAML API,覆盖面极广,工具链强大。决策形态与 Avalonia 相同:极好的目标,但要从 WinForms 彻底重写 UI。如果你的组织已经在 Uno 上有投入,它也 可作为 Majorsilence.Forms 的后端使用。

Eto.Forms

本项目之外、精神上最接近的方案:一个跨平台 .NET UI 库,提供窗体加控件的 API 而不是 XAML,绑定到 每个平台的原生部件(Windows 上是 WinForms,macOS 上是 Cocoa,Linux 上是 GTK)。各操作系统上的 原生外观是实打实的优势。

但它的 API 是自成一体的——Eto.Forms.Form 不是 System.Windows.Forms.Form,布局基于容器而不是 坐标/锚点,现有的设计器文件也没有迁移路径。你是在用一种熟悉的习惯用法重写。即便 Majorsilence.Forms 现在有了自己的 GTK 4 后端,这个对比依然成立:Eto 把它的控件映射到 GTK 部件上, 而 Majorsilence.Forms 只把 GTK 窗口和输入循环当作宿主,继续自己绘制 WinForms 形态的控件。

Mono 的 System.Windows.Forms

Mono 确实发布过一个 WinForms 重新实现,这就是旧论坛帖子里”WinForms 能在 Linux 上跑”的由来。 它面向的是 .NET Framework 时代,从未被带入现代 .NET,今天已不是新移植项目可行的目标。

Wine

Wine 在 Linux 和 macOS 上运行你未经修改的 Windows 二进制文件。代码一行不改,这确实很有吸引力—— 直到你需要为它提供支持:你交付的是一个 Windows 应用外加一个兼容运行时,Wine 对 Win32/GDI+ 的覆盖 程度如何你就得照单全收,与宿主操作系统的集成是近似的,安装程序和更新也会变得复杂。它是部署层面的 权宜之计,不是平台战略。

留在 WPF

WPF 是一个优秀的框架,从 WinForms 过去在概念上只是一小步,但它只支持 Windows。它解决的是 “让 UI 现代化”;解决不了”在 macOS 和 Linux 上运行”。(如果你已经有一个 WPF 外壳,想在其中放入 跨平台界面,Majorsilence.Forms 正好有一个 WPF 宿主后端——但 WPF 外壳本身仍留在 Windows 上。)

什么时候 Majorsilence.Forms 是正确答案

什么时候不是

下一步