我应该用GTK +而不是WinForms for Mono重写GUI吗?

我正在使用Visual Studio,winforms和我正在使用openTK进行应用程序。 最近我想过让它跨平台。 我打算使用Mono,因为我不知道其他类似的东西。 我完全没有使用GTK +的经验。 在我的应用程序中,目前有4个窗口(当然将来还会有更多)。 我想在Windows,Linux和OS X中快速开发应用程序。我读过,GTK +比WinForms更好,但仍然不确定选择哪个。 那么,我应该为GTK +重新制作一切还是继续使用WinForms? 为什么 ? 还有,有什么工具可以帮我吗?

老实说,你需要告诉我们更多有关你的受众 /目标市场的信息,以便提供一个很好的答案,但是从我开发的一些经验中获得的0.02美元是桌面上Mono的GUI开发是一个多目标事件,如果你想要的话这样做“正确”。 您将需要exception模块化地开发共享后端,然后每个平台编写一次UI。

视窗

如果你的应用程序处于起步阶段,在Mono上实现的Windows.Forms是一个很好的拐点,允许你立即定位Windows并在OS X和Linux上以一种有点残缺的方式部署。 但请注意,我在IRC上被告知Mono上的Windows.Forms开发基本上已经死了。 旧的bug没有得到更新,例如,我在测试的几分钟内遇到了在OS X上的RichTextBox中无法工作的SelectionBackColor(这是在Mono用于OS X上的Windows.Forms的一个问题)。 很好,它可能适用于快速实用程序,您可以在其中编写有关其限制的代码(请参阅此处的问题示例)。

OS X.

对于OS X的定位,如果你有一个真实的,商业的,最终用户的应用程序,你将需要习惯,嗯,与Interface Builder接口 。 我应该在这里明确指出,使用XCode和Interface Builder 绝对要求你可以访问运行OS X的盒子。否则,你会遇到Windows.Forms,或者最好,我认为,Gtk#。

Xamarin做得很好,使得它的IDE存根连接到在XCode中构建的本机UI。 这就是他们为iOS开发做的事情。 虽然文档很薄弱,但它运行得相当好。 2011年迈克尔·哈钦森(Michael Hutchingson)有一段很棒的video描述了这个过程 ,尽管我认为它在牙齿上的时间越来越长(即“旧”)。 ( 直接链接到video )

我假设如果你想要定位Mac App Store,Interface Builder也是你唯一真正的选择。 但是,看起来,它是一个本地用户界面,它存在于你的C#代码中,所有这些都被认为是一个很好的折衷方案。

Linux的

我还没有真正针对Linux。 看起来像Gtk#会很自然,但我在那里没有太多动手帮助。 我的东西构建在Windows.Forms中,并且有粗糙的边缘,就像在OS X中一样。如果我更严肃,我会从Gtk#开始,这也是MonoDevelop也有GUI RAD的地方。

一个严肃,成熟,跨平台的Gtk#app的例子

快速说明: Banshee使用Gtk#来定位OS X,Windows(alpha)和Linux。 您可以通过查看其邮件列表和其他资源,了解在大型应用程序跨平台上使用Gtk#的难度。

对不起,这个消息并不容易。 没有银弹/单一的正确答案。


201607更新:我认为答案正逐渐成为使用Xamarin.Forms来实现跨平台的目标。 你现在可能仍然无法编写单独的Mac界面,但有理由相信在某些时候也会支持Xamarin.Forms; 见下文。

不幸的是,如果你的目标是Linux,我认为你现在仍然和以前一样。

  • Windows:您现在可以使用Xamarin.Forms和UWP 。
  • macOS:你现在仍然处于同一个地方,但我上周末有一个Xamarin员工告诉我,Xamarin.Forms是非正式开发的OS X.我相信这是GitHub上的回购 。 (甚至还有一个tvOS的分支。)

我建议您考虑目标受众是什么。 使用像GTK这样的框架编写UI可能看起来不错,但对于普通用户来说,您的应用程序看起来不像其他Windows / OSX应用程序那样容易阻止人们使用它(除非它在其他方面非常特殊)。

执行此操作的最佳方法(由于时间/预算限制可能无法实现)是将应用程序逻辑放在单独的程序集中,然后为每个平台编写UI,使用Winform(或WPF)for Windows, MonoMac / Cocoa for OSX和GTK#for Linux。 它也不会限制您使用所有平台上可用的function,这会大大降低用户体验。

我现在面临着类似的问题 – 但Karl-Johan关于保持应用程序逻辑分离的说法将使任务变得更加容易。 查看ViewModel模式(MVVM),您将拥有更少的代码来重写和测试每个平台,因为中央逻辑变得与UI无关。