Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

开发Windows Phone应用程序:.NET vs. HTML

From Wiki
Jump to: navigation, search
SignpostIcon WP7 70px.png
Article Metadata

代码示例
兼容于
文章
WS_YiLunLuo 在 31 Jan 2012 创建
最后由 hamishwillee 在 16 Jul 2013 编辑

Contents

简介

我们知道在Windows Phone上可以开发三种类型的程序:

  • Silverlight:用于开发本机应用程序。
  • XNA:用于开发本机游戏。
  • HTML:用于开发基于浏览器的程序和游戏。

通常不会有谁搞错什么时候用Silverlight什么时候用XNA吧,而且事实上在最新版的Windows Phone中这两种技术是可以混用的,我们将它们统称为.NET,因为它们都使用.NET语言,都使用CLR。但是大家知道如何在.NET和HTML中间做出抉择吗?本文正是提供了一些相关建议。

示例代码

本文提供了两组示例代码。其中之一是一个正面示例,说明什么样的场合使用HTML是可行的。另外一个是负面示例,说明什么样的场合不适合在Windows Phone上使用HTML。

Star and Planet.PNG

Color Picker.PNG

请注意该负面示例仅针对Windows Phone而言,这不代表示例代码不能应用于非Windows Phone设备上。事实上若是你将它运行在你PC上的IE9中,你会发现它能很好地运行。这个示例也支持IE10的触摸手势,你可以尝试在一个带触摸屏的Windows 8 Developer Preview机体上运行。之所以不能运行在Windows Phone上是因为Windows Phone的浏览器不支持触摸手势,因此无法实现拖动效果。而在缺乏鼠标的情况下,要使用我们的颜色选择器会变得相当困难。之前我们也曾提供过一个基于.NET的颜色选择器,供大家参考。

Windows Phone对HTML的支持

首先我们看看Windows Phone上的IE浏览器对HTML的支持。这里我们针对Windows Phone 7.1进行说明,7.0实在太老了,请大家不要使用。 在Windows Phone 7.1上,我们能够使用的唯一一个浏览器是IE9 mobile。目前尚无第三方浏览器,因为Windows Phone不支持C++开发,而使用.NET写一个高性能浏览器是非常困难的。

HTML

IE9 mobile支持IE9的大多数特性,包括很多HTML5中已经确定的特性。常见的例子包括canvas, video, audio。本文附带的行星绕恒星旋转动画示例就是一个简单的基于canvas的示例。 但是IE9并不支持一些尚未被确认为标准的HTML5特性,例如file storage API。这些HTML5的API尚未成为标准,目前只是草稿状态。今后标准组织很可能会对该草稿进行修改,因此现在使用这些API会伴随着今后必须重写程序的风险。当然,从另一方面讲,如果你的程序需要访问手机的local storage以存储文件,很明显就不能使用HTML,而必须使用.NET了。 此外IE9 mobile并不支持IE8或更早期的兼容模式。若是你的程序针对早期版本IE优化,将必须重写成符合HTML标准的程序才能正常在Windows Phone上显示。

JavaScript

IE9 mobile支持大多数ECMAScript 5(JavaScript 5)的特性,所以你可以使用诸如属性之类的仅存在于ECMAScript5中的新特性。在本文附带的颜色选择器示例中,我们就使用了属性。虽然那是一个负面示例,但是就使用属性这一点而言还是证明了Windows Phone对ECMAScript5的支持。 但是之前也提到过,IE9 mobile(以及桌面版的IE9)有一个很大的局限性就是不支持触摸手势。目前国际上并没有一个标准规定这个API要怎样设计,因此也不能责怪Windows Phone。事实上iPhone和IE10的触摸手势API是不兼容的。IE10允许你很简单地将鼠标事件迁移到触摸事件,iPhone则稍微有些困难,需要针对鼠标和手指写两套不同的代码。目前Windows Phone并不支持IE10,我们期待在下个版本中会提供支持。因为缺乏这一特性,很多需要手指滑动或者多点触摸的应用场合在Windows Phone上并不适合用HTML和JavaScript来实现,推荐使用.NET。

CSS

和桌面版的IE9一样,IE9 mobile提供了一部分对CSS3的支持,基本上已经成为标准的样式都已经支持了。一个典型的例子是border-radius,让你可以实现圆角效果。 但是IE9 mobile不支持很多尚未成为标准的CSS3特性,例如渐变色,动画,等等。这些特性如果你需要在HTML程序中使用,必须依赖于图片和JavaScript。

其它

IE9 mobile支持大多数SVG的特性。我们的颜色选择器就使用了SVG。至少在显示SVG这一点上而言,IE9 mobile做得很好。 IE9 mobile不支持任何插件,这包括ActiveX, Flash, 甚至Silverlight。也就是说你使用.NET API写的Silverlight程序不能在Windows Phone的浏览器中运行,必须迁移到Windows Phone本机程序。 更多信息可以在这里找到。

.NET与HTML的异同

接下来,我们看看.NET与HTML的相似点和不同点,在很多情况下,其实你可以使用任意一种编程模型。其它情况下,你可能必须选择某一种。

发布模型

.NET和HTML程序最大的区别其实是发布模型。在Windows Phone上,所有的本机程序(native application)必须使用.NET编写,而且你在market place上能够发布的程序也必须是.NET程序。HTML程序不支持market place,它们只能以网页的形式提供给用户。当然,用户可以将某个网页pin到手机的开始页面上,就好像将某个本机应用程序pin起来一样。 在Windows 8中,你可以使用HTML编写本机程序,也可以发布到market place上。今后Windows Phone会不会学习Windows 8,目前还很难说。 不能发布至market place就意味着你不能使用market place的方式贩卖自己的HTML程序,而必须考虑使用类似于收费网站的形式。此外,没有了market place的帮助,你也必须依靠自己推广程序。因此如果你希望自己的的程序能使用market place来帮助推广贩卖,你必须使用.NET。

对硬件设施的支持

一个.NET程序可以使用很多硬件设施,例如多点触摸手势,重力感应,摄像头,麦克风,指南针,GPS,等等。而在HTML程序中,基本上唯一能使用的硬件设施就是GPS。在Windows Phone中,多点触摸手势不支持HTML,当然简单的点击手指还是会被翻译成onmousedown和onmouseup,但是其它诸如onmousemove之类的事件都不能使用。也正是因为这一点,本文附带的反面示例颜色选择器能很好地在支持鼠标的桌面版IE9或者支持触摸屏的IE10环境中使用,但是无法在Windows Phone中很好地工作。若是你的程序需要使用硬件设施,你必须使用.NET。 从广义上讲,硬件也包括本地存储(简单来说就是硬盘)。每个.NET程序可以访问属于自己的受隔离的一块存储空间,在那里你可以使用NTFS API创建/访问任意文件,甚至可以使用SQL Compact。但是HTML不支持这一点。 同样,在Windows 8中,你可以使用HTML程序访问本地硬件。但是Windows Phone今后会不会学习Windows 8,目前一切还没有任何消息。

可移植性

说到可移植性,HTML程序的优势就很明显了。同一个HTML程序,往往不需要修改就能运行在Windows Phone,iPhone,Android上。对CSS样式做少量的修改,例如使用media queries,也将能运行在绝大多数桌面版的浏览器中。 .NET程序要移植到其它平台上会比较困难,你必须重写整个程序。但是把.NET程序移植到微软自己的平台,例如Windows 8,是比较简单的。将.NET程序移植到C++相对来说也比较简单,因为C#和C++比较类似,都是面向对象的语言。 如果你的程序需要在短期内移植到很多平台上,强烈推荐你使用HTML,当然前提是你不需要market place支持,不需要访问本地硬件。

开发工具

Visual Studio允许你开发.NET程序和HTML程序。VS 2010对HTML的支持已经很强大了,VS 2012的支持会更好。但是就我个人的经验而言,在目前VS 2012 Developer Preview中,一旦你的HTML项目变得庞大,JavaScript智能感知还是会存在问题,希望在今后的release版本中能有所改善。此外,也有很多第三方工具可以开发HTML程序,但是很多开发人员都觉得不如Visual Studio那么好用。第三方工具对.NET的支持相对比较少。至于Visual Studio对.NET的支持有多强大,相信大家都心知肚明。

基本编程模型

使用.NET,你可以使用C#或VB这样的面向对象的语言。使用HTML,你必须用JavaScript。在这里我们不讨论两类语言的优劣,因为不同的人有不同的看法。但是使用JavaScript时,我们强烈建议大家使用面向对象的编程模型,否则一旦你的程序变得复杂,将很难维护代码。你可以在网上找到很多类库为JavaScript提供很好的OOP支持。此外,ECMAScript 5(JavaScript 5)提供了很多新的面向对象的功能,例如对属性的支持。既然Windows Phone支持ECMAScript 5,我们推荐大家尽可能地使用。在本文附带的的颜色选择器示例中,你们就会看到属性的应用。 此外,你可以找到很多类库协助你实现某些常见的设计模式,例如MVVM。无论是C#,VB,还是JavaScript,使用设计模式都是类似的。

其它方面的比较

以上是.NET和HTML较大的异同,也是大多数开发人员都会遇到的问题。最后我们再描述一些细节上的比较。

图形

就图形而言,.NET和HTML都提供了强大的支持。 在.NET中,你可以使用XAML定义各种矢量图形,也可以使用.NET代码动态创建图形,并将它们添加到visual tree中。.NET对位图的支持也很强大,在最简单的情况下,你可以使用Image控件来显示图片。此外WriteableBitmap允许你操作图片中的每一个像素,创建新的位图,或者实现截屏效果。若是你希望高性能地显示大量图片,也可以使用XNA的绘图模型。请注意XNA不能绘制矢量图形,只能绘制位图。 同样,在HTML中,你也可以通过SVG在HTML页面中直接嵌入矢量图形,或者用JavaScript代码动态创建图形并添加到DOM tree中。至于位图,简单情况下可以使用img控件来显示图片。需要操作位图中的每一个像素时,也可以使用canvas。此外,canvas也允许你创建矢量图形,但是canvas使用intermediate绘制模型,也就是说你的图形并不会被添加到DOM tree中,而是绘制完成后就从内存中扔掉。下次要刷新某区域时必须重新运行绘图代码。这个模型更接近于XNA,性能相对于SVG和XAML的retained模型要高一些,因为不需要操纵DOM/visual tree,而且占用的内存往往也相对小一些。不过如果要保存图形的状态,你就必须自己写代码了。通常SVG适用于绘制界面元素,而canvas适用于游戏或者画画这样的应用。最后,HTML不允许你截屏。如果你需要截屏的操作,就必须解析DOM tree,并且用canvas进行绘制。当然,有第三方类库已经帮你实现了该效果,例如html2canvas。 不管是.NET还是HTML,大部分和图形有关的操作都支持硬件加速。但是它们都不支持自定义shader effect。 需要注意的是,HTML程序中的位图往往都需要自网上下载,每幅图画都需要一个额外的请求。而.NET程序中,你既可以自网上下载图片,也可以将图画直接嵌入在程序中。为了提高HTML程序的性能,可以考虑使用CSS sprites,从而只需要下载一张相对大一点的图片,只需要发一个请求到服务器。无论如何,能使用CSS完成的场合(例如border-radius),就不要使用位图。 最后,HTML支持的图画格式比较丰富,而.NET目前只支持jpeg和png,其它图片格式需要自行解码,或者使用这样子的第三方类库。

文字

.NET和HTML对文字都有较好的支持。在.NET中,你可以使用Run让每一个/组文字显示不同的样式。同样,在HTML中也可以使用span。总的来说HTML对文字排版的支持相对更丰富一些。此外,目前针对HTML开发的文字排版工具要比针对.NET开发的多得多,所以若是你的程序主要就是为了让用户阅读排版丰富的文档,推荐还是使用HTML比较好。但是请注意,HTML不允许你使用自定义字体(目前该功能是HTML5中的一个草稿,Windows Phone不支持),而.NET则允许你在程序中嵌入自定义字体。若是你必须使用自定义字体,要么使用.NET,要么将文字转换成图片。

多媒体

就多媒体而言,.NET支持的视频/音频格式比较多,详细信息可以在这里找到。HTML只支持H.264(mp4)和mp3。此外,HTML不支持DRM。若是你只是想要做一个简单的电影/歌曲共享/播放网站,HTML就足够了。但如果希望提供专业的电影/歌曲播放支持,推荐使用.NET。不管是.NET还是HTML,所有的视频播放都支持硬件加速。

动画

.NET通过Storyboard提供了支持硬件加速,并且能直接在XAML中使用的动画,同时你也可以通过代码创建Storyboard,或者是一个简单的定时器(例如XNA中的定时器)。而HTML由于目前Windows Phone不支持CSS3动画,将必须通过编写JavaScript代码来实现动画效果。当然很多第三方类库,例如jQuery的动画库,也可以使用。注意使用JavaScript实现的动画通常不会被硬件加速,这和IE10的CSS3动画是不同的。

控件

总的来说,.NET的控件模型更强大一些,你可以创建自定义控件,也可以通过style和control template修改现有控件的外观,甚至可以通过组合XAML元素把它们改得面目全非。在HTML中,要实现自定义控件,你可以考虑使用jQuery plugin,当然简单场合下也可以就写一个object,在里面定义各种属性和方法,绘制各种界面元素。我们的颜色选择器并没有使用jQuery。在使用HTML制作控件时,请考虑使用SVG,因为SVG对矢量图形提供了强大的支持。

数据绑定

.NET提供了强大的数据绑定支持,你可以在XAML中定义丰富data template,将数据绑定到后台对象,或者某个元素。HTML本身不支持数据绑定,但是有各种各样的类库实现了这一效果。例如微软就写了一个jQuery Templates和Data Linking,从很大程度上讲已经和.NET的数据绑定等价了。

网络资源

无论是.NET还是HTML,都能够访问基于HTTP标准的REST service。 在.NET中你使用HttpWebRequest,或者更简单的场合下WebClient。所有的请求必须是异步的。使用.NET你可以跨域访问(cross domain)网络资源。 在HTML中,你使用XMLHttpRequest,或者对它的封装,例如jQuery的ajax函数。HTML对跨域访问的支持比较严格,你必须确保要访问的网络资源支持cross origin access control,或者在简单的GET请求场合下,可以使用JSONP(请注意该链接来自于Wikipedia,若是发现无法访问,可能是因为最近Wikipedia为了反对美国的两条新法律而罢工了,请稍后再次尝试)。 .NET同时也提供了少量的对SOAP 1.1的支持,但HTML本身并未提供,你需要寻找第三方类库,或者手工创建/解析SOAP envelop。考虑到很多第三方手机(例如iPhone和Andriod)本身都不支持SOAP,我们强烈推荐大家不要使用SOAP。 最后,使用.NET,你也可以使用socket,但目前HTML并不支持(HTML5有一个Windows Phone尚未支持的草稿web socket)。若是你需要高性能的即时通信,我们推荐使用.NET加socket。

总结

时代发展至今,.NET和HTML的区别已经不再那么巨大了。很多人为了推崇其中的某一个而大力反对另外一个是很不明智的做法。很多情况下选择哪个的决定因素很可能只是个人喜好以及对某种环境的熟悉程度。但是也有一些时候,你将不得不使用特定的一个,因此掌握.NET和HTML对我们这些开发人员而言是很重要的。总的来说,.NET适用于编写需要和market place结合的,需要使用到硬件设施的程序。HTML则适用于编写需要快速移植到其它平台上的程序。

This page was last modified on 16 July 2013, at 08:00.
211 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×