c# - 我应该用 GTK+ 而不是 WinForms 为 Mono 重写 GUI 吗?

标签 c# winforms mono gtk

我正在使用 Visual Studio、winforms 制作应用程序,我正在使用 openTK。最近我想让它跨平台。我将使用 Mono,因为我不知道其他类似的东西。而且我完全没有使用 GTK+ 的经验。在我的应用中,目前有4个窗口(当然以后会更多)。我想让应用程序在 Windows、Linux 和 OS X 上运行得更快。我读过,GTK+ 比 WinForms 好,但仍然不确定该选择哪个。那么,我应该为 GTK+ 重新制作所有内容还是继续使用 WinForms,为什么?另外,是否有任何工具可以为我完成这项工作?

最佳答案

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

window

如果您的应用还处于起步阶段,那么在 Mono 上实现的 Windows.Forms 是一个很好的拐杖,它允许您立即以 Windows 为目标,并在 OS X 和 Linux 上以有点残缺的方式部署。但是请注意,我在 IRC 上被告知在 Mono 上开发 Windows.Forms 基本上已经死了。旧错误没有得到更新,例如,我在几分钟的测试中遇到了 SelectionBackColor 在 OS X 上的 RichTextBox 中不起作用(这是 OS X 上用于 Windows.Forms 的 lib Mono 中的一个问题)。整洁,它就在那里,也许对快速实用程序有好处,您可以在其中编写代码来绕过它的限制(有关示例,请参见问题 here)。

操作系统

针对 OS X,如果你有一个真正的、商业的、最终用户的应用程序,你将需要习惯,嗯,与 Interface Builder 交互. 我应该在这里明确指出,使用 XCode 和 Interface Builder 绝对需要您可以访问运行 OS X 的机器。否则,您将无法使用 Windows.Forms,或者,我认为最好是 Gtk#。

Xamarin 在其 IDE 与 XCode 中构建的 native UI 的连接 stub 方面做得非常出色。这也是他们为 iOS 开发所做的。它工作得相当好,尽管文档很薄弱。有一个 great video from 2011 from Michael Hutchingson describing this process ,尽管我认为它已经过时了(即“旧”)。 ( Direct link to video )

如果您想瞄准 Mac App Store,我假设 Interface Builder 也是您唯一真正的选择。但是看,这是一个 stub 到您的 C# 代码的 native UI,从所有方面考虑,这是一个很好的妥协。

Linux

我还没有真正针对 Linux。似乎 Gtk# 很适合,但我没有太多实际帮助。我的东西构建在 Windows.Forms 中,并且有一些粗糙的边缘,就像在 OS X 中一样。如果我变得更认真,我会从 Gtk# 开始,这也是 MonoDevelop 拥有其 GUI RAD 的地方。

一个严肃、成熟、跨平台的 Gtk# 应用程序示例

快速说明:Banshee使用 Gtk#以 OS X、Windows(alpha)和 Linux 为目标。通过查看 its mailing list,您可以了解在大型应用程序跨平台上使用 Gtk# 有多么困难。和其他资源。

抱歉,这个消息并不容易。没有 Elixir /唯一正确答案。


201607 更新:我认为答案正在慢慢变成使用 Xamarin.Forms 来定位跨平台。您现在可能仍然无法编写单独的 Mac 界面,但有理由相信 Xamarin.Forms 也会在某个时候得到支持;见下文。

不幸的是,如果您的目标是 Linux,我认为您现在仍然和以前一样在同一条船上。

  • Windows:您现在可以使用 Xamarin.Forms and UWP .
  • macOS:你基本上还是在同一个地方,但我有一个 Xamarin 员工上周末告诉我 Xamarin.Forms 是非正式的 OS X 开发。我相信 this is the repo on GitHub . (甚至还有一个 tvOS 分支。)

关于c# - 我应该用 GTK+ 而不是 WinForms 为 Mono 重写 GUI 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254547/

相关文章:

c# - Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)

c# - 使用动态 LINQ(或泛型)查询/筛选 Azure 表

.net - 什么控制 WinForms 中默认的 UnhandledException 策略?

c# - 图片框变大红色 X 但我无法检测或修复它

c# - 在没有安装数据库程序的情况下使用C#读取数据库文件?

c# - 在 dotnet 核心 SDK 版本之间切换

c# - WinForms ReadOnly TextBox Ctrl-R 键按下

c# - debian 上的单声道 : Could not find file "/srv/www/proj/bin\roslyn\csc.exe"

c# - Gtk# TreeView 将单个单元格设置为具有不同的渲染器?

c# - Unity 的垃圾收集器——为什么是非分代和非压缩的?