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

???原文地址

现在用 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 的热度还有待观察。?

翻译原文

时间: 2024-10-11 07:21:12

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

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

题外话 不出意外,本片内容应该是最后一篇关于.Net技术的博客,做.Net的伙伴们忽喷忽喷..Net挺好的,微软最近在跨平台方面搞的水深火热,更新也比较频繁,而且博客园的很多大牛也写的有跨平台相关技术的博客.做.Net开发块五年时间,个人没本事,没做出啥成绩.想象偶像梅球王,年龄都差不多,为啥差别就这么大.不甘平庸,想趁机会挑战下其他方面的技术,正好有一个机会转前段开发. 对于目前正在从事或者工作中会用到WPF技术开发的伙伴,此片内容不得不收藏,本片介绍的八个问题都是在WPF开发工作中经常使用到

10大APP界面框架设计模式详解

随着移动互联网的发展,移动app已经成为了每个互联网公司的标配了,那作为产品经理,我们如何设计出更加符合用户体验的app产品呢?今天和大家分享的就是10中最常见的app界面光甲设计模式,一起来看看吧. 1.标签导航 标签导航是十大界面框架设计里最常用的界面框架设计,也是被业界之内公认的一种普遍使用的页面框架设计.那么这种页面框架设计在作业方面对一个用户来说也是最常见的一种页面框架设计,比如说微博.微信.手机百度.支付宝.淘宝,这些我们所谓的超级APP都是运用的标签导航,无一例外.从这个角度也可以

JobEngine 基于quartz.net 跨平台作业框架

github:https://github.com/zzhi/JobEngine 基于quartz.net 的跨平台作业框架 quartz.net(https://github.com/quartznet/quartznet/tree/features/netcore11) 也支持跨平台了 ,由于NuGet无法安装quartz-DotNetCore dll. 所以我直接把这个解决方案下载下来,删除一些无用的代码,在解决方案上直接创建项目JobServer, 通过添加引用的方式引用quartz-D

准备.Net转前端开发-WPF界面框架那些事,搭建基础框架

题外话 最近都没怎么写博客,主要是最近在看WPF方面的书<wpf-4-unleashed.pdf>,挑了比较重要的几个章节学习了下WPF基础技术.另外,也把这本书推荐给目前正在从事WPF开发的程序猿. 现在书看完了也该实践实践,写了个WPF项目,主要以界面框架为主.  最近的几篇博客也主要围绕这个WPF项目,介绍下WPF搭建界面框架以及怎样写自定义的Windows界面和控件. 这也许是写最后几篇关于.Net技术的博客.做.Net开发也快五年了,感觉自己搞得不温不火,另外工作中正好有一个机会转做

跨平台UI框架杂思——02

距离本系列最后一篇随笔<跨平台UI框架杂思--01>的发表已经过去了一年多.这一年多我都没怎么在外头写blog了(写东西都放在公司的 confluence page 里).这一年多我的"跨平台UI框架"实现了,并且用到了公司的产品中.我很欣慰地发现这一年多来,我都是按照最后一篇随笔的思路来开展的-- 硬件加速渲染 高可扩展性 灵活可替换的渲染框架 在Windows上面做透了 首先实现了 Direct2D 的渲染 由于这个框架是我在公司写的,所以目前暂且没能对外开源. 框架的

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

1 源码下载 2 OSGi.NET插件应用架构概述 3 漂亮界面框架原理概述 4 漂亮界面框架实现  4.1 主程序  4.2 主程序与插件的通讯   4.2.1 主程序获取插件注册的服务   4.2.2 插件获取主程序注册的服务   4.2.3 服务接口  4.3 权限管理插件的登录窗体  4.4 界面框架插件   4.4.1 导航服务   4.4.2 界面框架扩展实现  4.5 插件   4.5.1 插件引用了第三方程序集   4.5.2 一个程序集如何让所有插件都直接使用   4.5.3

分享一个漂亮WPF界面框架创作过程及其源码

本文会作为一个系列,分为以下部分来介绍: (1)见识一下这个界面框架: (2)界面框架如何进行开发: (3)辅助开发支持:Demo.模板.VsPackage制作. 框架源码如下所示. 本文介绍第(1)部分. 1 安装 现在我们就先来见识一下这个界面框架.首先,你可以通过以下链接来下载到这个框架的VS插件安装包:下载地址.下载解压后,文件如下: 双击这个文件,进行安装(目前只支持VS2012和VS2013,抛弃了VS2010,I am sorry). 点击安装,即可完成. 2 创建主程序 接着打开

Android应用经典主界面框架之一:仿QQ (使用Fragment, 附源码)

最近反复研究日常经典必用的几个android app,从主界面带来的交互方式入手进行分析,我将其大致分为三类.今天记录第一种方式,即主界面下面有几个tab页,最上端是标题栏,tab页和tab页之间不是通过滑动切换的,而是通过点击切换tab页.早期这种架构一直是使用tabhost+activitygroup来使用,随着fragment的出现及google官方也大力推荐使用fragment,后者大有代替前者之势.本文也使用fragment进行搭建,标题中的"经典"指这种交互经典,非本文的代

基于Extjs的web表单设计器 第六节——界面框架设计

基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计 基于Extjs的web表单设计器 第七节——取数公式设计 基于Extjs的web表单设计器 第八节——表单引擎设计 这一节我给大家介绍一下表单设