为跨平台开发分离抽象UI和具体UI(WinForms,Cocoa,GTK +)

Yve*_*lpe 5 c# model-view-controller cocoa winforms monomac

我目前正在制作一个在后端共享代码的应用程序.作为表示层,我使用的是WinForms,Cocoa(MonoMac)和GTK#(Linux).

我正在寻找一种以抽象方式描述我的用户界面的方法,因此具体的UI实现(Cocoa,WinForms,GTK#)只需要担心显示和绘图.

这样我就可以 - 从具体视图中连接事件(按钮点击,数据输入)并将它们绑定到控制器/或抽象视图处理程序中的函数. - 让控制器/抽象视图/模型更新视图..?

所以基本上我试图得到一种IView,IController和IModel设置......或者Model-View-Presenter,或MVVM,那里有任何示例应用程序......?因为有很多理论,但没有具体的例子.


编辑2017年1月:"电子"

对于那些想在LINUX/WINDOWS和MAC上制作桌面跨平台应用程序的人,我建议也考虑一下Electron(electron.atom.io).它基本上是Chromium + NodeJS - 这意味着一个浏览器的UI设计具有Node(和npm包)的强大功能.您还可以通过EdgeJS挂钩.NET代码.

Yve*_*lpe 4

2017 年 1 月编辑:“电子”

对于那些想要在 LINUX / WINDOWS 和 MAC 上为桌面制作跨平台应用程序的人,我建议也研究一下 Electron ( electro.atom.io )。它基本上是 Chromium+NodeJS - 这意味着具有 Node(和 npm 包)功能的一款浏览器的 UI 设计。您还可以通过EdgeJS挂钩 .NET 代码。


每个项目都会有它自己的需求,但其他项目试图找到答案,这就是我实现的。

我决定研究被动 模型-视图-呈现器设计模式。要详细阅读,请查看Wikipedia 文章Martin Fowler 的这篇文章。另一种替代实现是“thedersen.com”的实现 -请阅读此处的文章


定制实施

我最终完成了自己的设计模式的基本实现。这是为了更好地理解模式,并更好地控制实现细节。后一项很重要,因为实现需要能够处理标准 Microsoft 技术之外的多种 UI 技术。例如:Cocoa (MonoMac)GTK# (GTK+)等...

实施将实施被动视图,并将牢记以下准则:

  • 与模型的交互完全由演示者处理;
  • 视图仅由演示者更新;
  • 视图可以通过广播事件来通知呈现者;

图表

在此输入图像描述


框架代码 检查此Pastebin中的接口和基类。 http://pastebin.com/k6xhwrJ8

示例代码

该示例将显示一个基本的加载屏幕(引导程序)。所有代码都在永不过期的 Pastebin 中。某些方法(用于创建和实例化控件)不存在,因为这当然不是示例的重点。

它在 Windows 上的外观示例。 在 MacOS 上,视图当然将具有其本机 UI。


这就是我的基本解决方案。是的,这是基本的,但它确实帮助我创建后端代码,并且不用太担心如何将视图链接在一起。

扩展点可能包括:

  • 添加演示者和视图管理器,这样就可以以 IoC 方式工作......
  • 为不同场景添加更多扩展的基本视图和演示者...