​​​原文地址

现在用 C# 来开发​跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码。这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成。

这里的深度集成主要是指一些 Windows 专有的系统特性:

  • Windows 托盘
  • Windows 跳转列表
  • Windows 系统主题

也包括一些移动平台的特性,例如 iOS 的原生滑动。

​由于操作系统上其他程序一般都使用原生控件,于是只有当你的程序采用同样技术时,它才能很好地保持一致。这是一个大家一般遵守的界面开发约定。苹果公司有详细的界面设计准则,供开发者参考

游戏程序一般全屏,也不需要遵守这个约定。其他程序,例如 RealPlayer、QQ,也是违背这种约定。个人观点是,尽量不要搞特殊化。

​因此如果你决定采用这个方案,那么在不同的操作系统上你需要学习不同的界面框架:

  • Windows:Windows Forms *
  • macOS:Xamarin.Mac(封装 Cocoa) **
  • Linux:GTK#(封装 GTK+)***
  • iOS:Xamarin.iOS(封装 CocoaTouch)
  • Android:Xamarin.Android(封装 Android UI)

值得注意的是:

* Windows 平台正在经历整体界面设计的变化,未来标准的界面框架应该是 UWP。WPF 虽然也是微软官方支持的技术,但是和 WinForms 相比,它依然是自己绘制,算不上原生界面框架。

​** MonoMac 因为各种原因已经废弃 参见

*** QtSharp 等框架都不太成熟。

​市场上很多成功的项目都是这个方案的受益者。下面举几个例子:

  • 国家仪器的 LabView 官方网站 在 iOS 平台使用 Xamarin.iOS 移动版地址,在 Windows 平台使用 Windows Forms(这个不是特别确定)。
  • Plastic SCM 官方网站 在 Linux 平台使用 GTK#,在macOS 使用 Xamarin.Mac,而在 Windows 上使用 Windows Forms。
  • iCircuit 官方网站 在 macOS 使用 Xamarin.Mac,在 iOS 使用 Xamarin.iOS,在 Android 使用 Xamarin.Android,在 Windows 和 Windows Phone 上使用微软的技术。

不过总有程序员希望能够使用跨平台界面框架,来简化自己的工作。所以这篇文章也介绍一些业已存在的跨平台界面框架,以供参考。它们虽然各不相同,但是大体都使用了下面三种设计思想中的一个:

  • 控件完全自己绘制,在不同操作系统上模拟系统控件的效果。
  • 在某个操作系统上是原生框架,在其他操作系统上通过模拟实现显示。
  • 设计时抽象,运行时映射到原生控件。

Unity/MonoGame

设计思想:完全自己绘制(不过没有什么标准控件概念)

操作系统:桌面和移动设备(还包括游戏终端等)

显示效果:和操作系统没关系

三方控件:谈不上

这两个都是游戏引擎。非要用它们来设计跨平台应用技术上是可行的,但是因为没有操作系统控件之类的东西,完全需要自己绘制,所以开发非游戏应用,难度还是有的。至于和操作系统深度集成,就更加麻烦。

GTK#

设计思想:在 Linux 上是原生框架,在其他操作系统上也能模拟运行。

操作系统:桌面

显示效果:Linux 上深度集成

三方控件:有一些,但没有非常活跃的提供商

GTK 本来就是一个针对桌面程序开发的跨平台界面框架,所以 GTK# 封装之后也是很好用的。然而,它在非 Linux 操作系统上的显示效果是很差的(比如 Windows 上和系统主题很不搭)。

MonoDevelop 是采用 GTK# 的 IDE。当微软/Xamarin 将它改造为 Visual Studio for Mac 时,很多界面部分就已经换成了系统原生的 Xamarin.Mac 了。

Windows Forms

​设计思想:在 Windows 上是原生框架,在其他操作系统上也能模拟运行。

操作系统:桌面

显示效果:Windows 上深度集成

这是绝大部分 C# 程序员入门时学习的界面框架,能够快速集成 Windows 各种控件。虽然也支持 Windows CE 移动平台,但是基本没什么用。Mono 从2.0版本开始将它迁移到 Linux 等操作系统。Plastic SCM 最初也是使用 Mono Windows Forms 将自己的 Windows 客户端迁移到其他操作系统。但是 Mono 的实现在很多细节上并不完美,还需要很大精力去改进。Plastic SCM 后期就放弃了跨平台 Windows Forms 这条路。

​Windows Forms 在 Windows 平台拥有大量第三方控件,而这些控件基本都不支持 Linux 等操作系统。尽管最近微软开始将 System.Drawing 变成一个跨平台技术,也使得官方的 Windows Forms 有可能成为一个跨平台界面方案,但是在非 Windows 平台的显示效果如何抑或是三方市场会不会跟随都还未知。

最为重要的是 Windows Forms 本来就是为桌面设计,它没法很好的支持移动平台。早在 MonoTouch 最初开发阶段,Mono 团队就有想过将 Windows Forms 变成 iOS 平台的界面框架 相关文章。当然,最后他们很明智地放弃了这个想法,而是采用了封装 Cocoa Touch 的原生方案。

WPF/Avalonia/UWP

设计思想:完全自己绘制。

操作系统:桌面(UWP 支持 Windows 移动版,Avalonia 有移动支持)

显示效果:Windows 上深度集成

三方控件:Windows 平台很多

WPF 和 UWP 都是微软官方的技术,而 Avalonia 官方网站尝试将类似的设计变成一个跨平台的技术。

Delphi 有一个非常像 WPF 的界面框架 FireMonkey,已经完全跨平台(桌面和移动设备),所以 WPF 相关技术想跨平台技术上是完全可行的,但是挑战也是很多的。

虽然微软想了很多办法来改进 WPF 和系统的集成(包括多套主题),但是它始终不能像 Windows Forms 那样原生显示。当然从 Windows 10 开始,微软干脆用 UWP​ 来开发系统自带的程序,这样 UWP 最后还是会成为原生框架的。

Xamarin.Forms

设计思想:原生控件映射。

操作系统:移动平台(开始尝试桌面支持)

显示效果:总是和原生系统深度集成

三方控件:快速发展中

Xamarin 开发这个技术,最开始是为了跨平台移动应用,但是最近它已经开始走向桌面场景,比如 macOS(WPF 和 GTK# 的集成也在开发中)。

和完全自己绘制技术不同的是,Xamarin.Forms 程序在设计时使用的是抽象控件。设计时的按钮、列表等控件,到运行时会映射到操作系统原生的按钮、列表等控件上。所以从显示效果来看,这是最好的一项技术。

更为重要的是,Xamarin.Forms 新版本已经支持直接嵌入原生控件,也支持原生程序嵌入 Xamarin.Forms 界面,为开发者带来更多的灵活性。

但是这个技术暂时也是有局限的,就是它的控件都还是为移动应用设计。假如你的目标是设计一个 Office 或者 Visual Studio 那样的标准桌面应用,那么就会遇到困难。好在也不是所有场景我们都需要那么复杂的界面。

现在已经有很多第三方为 Xamarin.Forms 提供控件:

越来越多三方的加入也使得这个技术更加活跃。

xwt/Eto.Forms

设计思想:原生控件映射。

操作系统:桌面(开始尝试移动支持)

显示效果:总是和原生系统深度集成

三方控件:暂时不多

这两个技术都和 Xamarin.Forms 相似,但是它们都是从桌面平台开始的。

xwt 官方网站 是 Mono 项目的一部分。我个人认为它启发了 Xamarin.Forms 的设计。Eto.Forms 官方网站 相对比较新,而且开始进入移动平台。

这两个框架会不会最后到达 Xamarin.Forms 的热度还有待观察。​

翻译原文

.NET 跨平台界面框架和为什么你首先要考虑再三的更多相关文章

  1. 【译】.NET 跨平台界面框架和为什么你首先要考虑再三

    现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...

  2. 全球首个全流程跨平台界面开发套件,PowerUI分析

    一.       首个全流程跨平台界面开发套件,PowerUI正式发布 UIPower在DirectUI的基础上,自主研发全球首个全流程跨平台界面开发套件PowerUI(PUI)正式发布,PowerU ...

  3. 2013 Visual Studio Magazine读者选择奖界面框架类获奖情况

    2013 Visual Studio Magazine读者选择奖已经正式揭晓了!据了解,截至今年此奖项已经评选了21次,非常值得.NET开发人员信赖和参考.此次评选共有400多个产品角逐28个分类的奖 ...

  4. 准备.Net转前端开发-WPF界面框架那些事,值得珍藏的8个问题

    题外话 不出意外,本片内容应该是最后一篇关于.Net技术的博客,做.Net的伙伴们忽喷忽喷..Net挺好的,微软最近在跨平台方面搞的水深火热,更新也比较频繁,而且博客园的很多大牛也写的有跨平台相关技术 ...

  5. 《Visual Studio Magazine》2013年读者选择奖—界面框架类

    好消息!2013 Visual Studio Magazine读者选择奖已经正式揭晓了!据了解,截至今年此奖项已经评选了21次,非常值得.NET开发人员信赖和参考.此次评选共有400多个产品角逐28个 ...

  6. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  7. [虾扯蛋] android界面框架-Window

    从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...

  8. 【Windows编程】系列第十一篇:多文档界面框架

    前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...

  9. 【源码分享】WPF漂亮界面框架实现原理分析及源码分享

    1 源码下载 2 OSGi.NET插件应用架构概述 3 漂亮界面框架原理概述 4 漂亮界面框架实现  4.1 主程序  4.2 主程序与插件的通讯   4.2.1 主程序获取插件注册的服务   4.2 ...

随机推荐

  1. Spring Mvc 用Demo去学习

    1:首先大体知道 SpringMVC 框架的 运行原理(图片来自网络 ) 2:SpringMVC 是依照DispatcherServlet 展开的 这里可以约Structs2对比,structs2 是 ...

  2. ionic 使用mobisscrolls,实现日期选择的插件

    废话不多说,直接说用法: 1,先下载mobisscrolls的破解版,下载地址,链接:http://pan.baidu.com/s/1boSKf51 密码:5dft 当然你也可以去官网下载,不过官网的 ...

  3. python 多线程,进程的理解

    python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交 ...

  4. Web开发安全小贴士

    想要开发出一个安全的.健壮的Web应用其实是非常困难的, 如果你想要快速开发出一款集使用价值.用户体验度.以及安全性为一身的产品,以下安全步骤很必要!!!     数据库 1.对类似访问令牌.电子邮箱 ...

  5. SQL Server 在Alwayson上使用内存表"踩坑"

    200 ? "200px" : this.width)!important;} --> 介绍 因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发 ...

  6. JavaScript 循环性能比较

    有一句话叫做 没有什么事是一个循环解决不了的,如果真有,那就再来一个循环. 循环的种类有很多 正向for循环,逆向for循环,while循环,for-in循环(理论上性能最差),for-each循环, ...

  7. GPUImage的filter 响应处理链 的理解笔记

    GPUImage的filter的textures处理链式结构 两个最重要的的地方: 最重要的一个类GPUImageOutput(所有的filter的父类,其他也有继承它的,如GPUImageUIEle ...

  8. Vue 爬坑之路(四)—— 与 Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  9. rovio 视觉里程计的笔记

    rovio是一个紧耦合,基于图像块的滤波实现的VIO. 他的优点是:计算量小(EKF,稀疏的图像块),但是对应不同的设备需要调参数,参数对精度很重要.没有闭环,没有mapping thread.经常存 ...

  10. C++构造函数(二)

    本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...