我正在使用 Visual Studio、winforms 制作应用程序,并且正在使用 openTK。最近我想让它跨平台。我将使用 Mono,因为我不知道其他类似的东西。而且我完全没有使用 GTK+ 的经验。在我的应用程序中,目前有 4 个窗口(当然以后还会有更多)。我想让应用程序在 Windows、Linux 和 OS X 中快速运行。我读过 GTK+ 比 WinForms 更好,但仍然不确定该选择哪个。那么,我应该为 GTK+ 重新制作所有内容还是继续使用 WinForms,为什么?另外,是否有任何工具可以为我完成这项工作?
3 回答
老实说,您需要告诉我们更多有关您的受众/预期市场的信息以提供一个很好的答案,但是我从那里开发的一些经验中获得的 0.02 美元是,如果您愿意,桌面上 Mono 的 GUI 开发是一个多目标的事情做到“正确”。您将需要非常模块化地开发共享后端,然后为每个平台编写一次 UI。
视窗
如果您的应用程序处于起步阶段,那么在 Mono 上实现的 Windows.Forms 是一个很好的支持,它允许您立即以 Windows 为目标并在 OS X 和 Linux 上以一种有点残缺的方式部署。但是请注意,我在 IRC 上被告知 Mono 上的 Windows.Forms 开发基本上已经死了。旧的错误没有得到更新,例如,我在测试的几分钟内遇到了 SelectionBackColor 无法在 OS X 上的 RichTextBox 中工作(这是 Mono 在 OS X 上用于 Windows.Forms 的库中的一个问题)。整洁,它就在那里,也许对于快速实用程序很有用,您可以在其中围绕其限制进行编码(请参阅此处的问题以获取示例)。
操作系统
对于 OS X,如果你有一个真正的、商业的、最终用户的应用程序,你将需要习惯,嗯,与Interface Builder交互。 我应该在这里明确一点,使用 XCode 和 Interface Builder绝对要求您可以访问运行 OS X 的机器。 否则,您将被 Windows.Forms 或最好,我认为 Gtk# 卡住。
Xamarin 在将其 IDE 存根连接到 XCode 中内置的本机 UI 方面做得很好。这也是他们为 iOS 开发所做的方式。它工作得很好,尽管文档很弱。迈克尔·哈钦森(Michael Hutchingson)在 2011 年发布了一段很棒的视频,描述了这个过程,尽管我认为它已经过时了(即“老”)。(直接链接到视频)
如果你想瞄准 Mac App Store,我假设 Interface Builder 也是你唯一真正的选择。但是看,它是一个存根到您的 C# 代码的本机 UI,从所有方面考虑,这是一个很好的折衷方案。
Linux
我并没有真正针对 Linux。似乎 Gtk# 很自然,但我没有太多的动手帮助。我的东西是在 Windows.Forms 中构建的,并且有一些粗糙的边缘,就像在 OS X 中一样。如果我更认真,我会从 Gtk# 开始,这也是 MonoDevelop 的 GUI RAD 所在。
一个严肃的、成熟的、跨平台的 Gtk# 应用程序示例
快速说明:Banshee使用Gtk#来针对 OS X、Windows(alpha)和 Linux。通过查看 Gtk#的邮件列表和其他资源,您可以了解在大型应用程序跨平台上使用 Gtk# 有多么困难。
抱歉,这个消息并不容易。没有灵丹妙药/唯一正确答案。
201607 更新:我认为答案正在慢慢变成使用 Xamarin.Forms 来定位跨平台。您现在可能仍然无法编写单独的 Mac 界面,但有理由相信它也会在某个时候获得 Xamarin.Forms 支持;见下文。
不幸的是,如果你的目标是 Linux,我认为你现在仍然和以前一样。
- Windows:您现在可以使用Xamarin.Forms 和 UWP。
- macOS:您基本上仍然在同一个地方,但我有一个 Xamarin 员工上周末告诉我 Xamarin.Forms 正在非正式地为 OS X 开发。我相信这是 GitHub 上的 repo。(甚至还有一个 tvOS 分支。)
我建议你考虑一下你的目标受众是什么。使用 GTK# 之类的框架编写 UI 似乎是个好主意,但对于普通用户来说,您的应用程序看起来不像其他 Windows/OSX 应用程序,这很容易阻止人们使用它(除非它在其他方面确实非常出色)。
最好的方法(由于时间/预算限制可能无法实现)是将应用程序逻辑放在单独的程序集中,然后为每个平台编写 UI,使用 Winform(或 WPF)为 Windows,MonoMac /Cocoa适用于 Linux 的 OSX 和 GTK#。它也不会限制您使用所有平台上可用的功能,这会大大降低用户体验。
我现在面临着类似的问题——但 Karl-Johan 所说的保持应用程序逻辑分离将使任务变得更加容易。查看 ViewModel 模式 (MVVM),您将可以为每个平台重写和测试更少的代码,因为中央逻辑变得与 UI 无关。