为跨平台开发(WinForms、Cocoa、GTK+)分离抽象 UI 和具体 UI
Separating Abstract UI and Concrete UI for Cross Platform Development (WinForms, Cocoa, GTK+)
我目前正在开发一个在后端共享代码的应用程序。作为表示层,我使用 WinForms、Cocoa (MonoMac) 和 GTK# (Linux)。
我正在寻找一种方法来以抽象的方式描述我的用户界面,以便具体的UI实现(Cocoa、WinForms、GTK#)需要担心显示和绘制.
这样我就可以
- 从具体视图连接事件(按钮点击、数据输入)并将它们绑定到 controller/or 抽象视图处理程序中的函数..?
- 让 controller/abstract view/model 更新视图..?
所以基本上我正在尝试进行一种 IView、IController 和 IModel 设置...或 Model-View-Presenter 或 MVVM,是否有任何示例应用程序...?因为理论很多,没有具体的例子。
编辑 2017 年 1 月:"Electron"
对于那些想要在 LINUX / WINDOWS 和 MAC 上为桌面制作跨平台应用程序的人,我建议您也研究一下 Electron (electron.atom.io). It's basically Chromium+NodeJS - which means UI design for one browser with the power of Node (and npm packages). You can also hook .NET code via EdgeJS.
编辑 2017 年 1 月:“电子”
对于那些想要在 LINUX / WINDOWS 和 MAC 上为桌面制作跨平台应用程序的人,我建议您也研究一下 Electron (electron.atom.io). It's basically Chromium+NodeJS - which means UI design for one browser with the power of Node (and npm packages). You can also hook .NET code via EdgeJS.
每个项目都会有自己的需求,但其他人试图找到答案,这就是我实现的。
我决定研究 Passive Model-View-Presenter 设计模式。如需详细阅读,请查看 Wikipedia article, or this article by Martin Fowler. Another alternative implementation is the one by "thedersen.com" - read the article here.
自定义实现
我最终完成了我自己的设计模式的基本实现。这是为了更好地理解模式,并更好地控制实现细节。后一个很重要,因为实现需要能够处理多种 UI 技术,而不是标准的 Microsoft 技术。例如:Cocoa (MonoMac), GTK# (GTK+),等等...
实施将实施被动视图,并将牢记以下准则:
- 与模型的交互完全由演示者处理;
- 视图仅由演示者更新;
- 视图可以通过广播事件通知演示者;
图
框架代码
检查此 pastebin 以获取接口和基础 类。
http://pastebin.com/k6xhwrJ8
示例代码
该示例将显示一个基本的加载屏幕(引导程序)。所有代码都在永不过期的 pastebin 中。一些方法(用于创建和实例化控件)不存在,因为这不是示例的重点。
勾选这个pastebin for the "Api"/"BackEnd" code of a "Bootstrapper": http://pastebin.com/NrKFrz77
勾选这个pastebin for the WinForms implementation code of the Bootstrapper View: http://pastebin.com/gmu3eFFs
勾选这个pastebin for the Cocoa (MonoMac) implementation code of the Bootstrapper View: http://pastebin.com/iTTvk8pJ
我的基本解决方案到此结束。它是基本的,但它确实帮助我创建后端代码并且不用太担心如何 link 视图在一起。
扩展点可能包括:
- 添加演示者和视图管理器,这样就可以按照 IoC 的方式工作...
- 为不同场景添加更多扩展基础视图和演示者...
我目前正在开发一个在后端共享代码的应用程序。作为表示层,我使用 WinForms、Cocoa (MonoMac) 和 GTK# (Linux)。
我正在寻找一种方法来以抽象的方式描述我的用户界面,以便具体的UI实现(Cocoa、WinForms、GTK#)需要担心显示和绘制.
这样我就可以 - 从具体视图连接事件(按钮点击、数据输入)并将它们绑定到 controller/or 抽象视图处理程序中的函数..? - 让 controller/abstract view/model 更新视图..?
所以基本上我正在尝试进行一种 IView、IController 和 IModel 设置...或 Model-View-Presenter 或 MVVM,是否有任何示例应用程序...?因为理论很多,没有具体的例子。
编辑 2017 年 1 月:"Electron"
对于那些想要在 LINUX / WINDOWS 和 MAC 上为桌面制作跨平台应用程序的人,我建议您也研究一下 Electron (electron.atom.io). It's basically Chromium+NodeJS - which means UI design for one browser with the power of Node (and npm packages). You can also hook .NET code via EdgeJS.
编辑 2017 年 1 月:“电子”
对于那些想要在 LINUX / WINDOWS 和 MAC 上为桌面制作跨平台应用程序的人,我建议您也研究一下 Electron (electron.atom.io). It's basically Chromium+NodeJS - which means UI design for one browser with the power of Node (and npm packages). You can also hook .NET code via EdgeJS.
每个项目都会有自己的需求,但其他人试图找到答案,这就是我实现的。
我决定研究 Passive Model-View-Presenter 设计模式。如需详细阅读,请查看 Wikipedia article, or this article by Martin Fowler. Another alternative implementation is the one by "thedersen.com" - read the article here.
自定义实现
我最终完成了我自己的设计模式的基本实现。这是为了更好地理解模式,并更好地控制实现细节。后一个很重要,因为实现需要能够处理多种 UI 技术,而不是标准的 Microsoft 技术。例如:Cocoa (MonoMac), GTK# (GTK+),等等...
实施将实施被动视图,并将牢记以下准则:
- 与模型的交互完全由演示者处理;
- 视图仅由演示者更新;
- 视图可以通过广播事件通知演示者;
图
框架代码 检查此 pastebin 以获取接口和基础 类。 http://pastebin.com/k6xhwrJ8
示例代码
该示例将显示一个基本的加载屏幕(引导程序)。所有代码都在永不过期的 pastebin 中。一些方法(用于创建和实例化控件)不存在,因为这不是示例的重点。
勾选这个pastebin for the "Api"/"BackEnd" code of a "Bootstrapper": http://pastebin.com/NrKFrz77
勾选这个pastebin for the WinForms implementation code of the Bootstrapper View: http://pastebin.com/gmu3eFFs
勾选这个pastebin for the Cocoa (MonoMac) implementation code of the Bootstrapper View: http://pastebin.com/iTTvk8pJ
我的基本解决方案到此结束。它是基本的,但它确实帮助我创建后端代码并且不用太担心如何 link 视图在一起。
扩展点可能包括:
- 添加演示者和视图管理器,这样就可以按照 IoC 的方式工作...
- 为不同场景添加更多扩展基础视图和演示者...