微软曾经对WPF(代号Avalon)抱很大的期望——新一代的华丽用户界面平台,一统Web应用和桌面应用,Flash杀手,尽管微软口头上不承认。几年下来,WPF确实实现了当初的预期的大部分功能,但离称霸软件开发领域还有不小的距离。不过,刚转到WinForm上一两年的开发人员们都很困惑,WinForm究竟还有没有未来。微软只是模糊地说短期内还是WinForm,长期是WPF。想想“维纳斯”,“TabletPC”,“Hailstorm”,“IE Channels”等等就知道这位老大的话不能全信。到底何去何从就仁者见仁智者见智了。

英文开发社区内有句流行的话,叫“No silver bullet”,就是说没有万能钥匙,没有一个工具或方法能完美地解决所有的问题。同样这对WPF也适用。与其说WPF是WinForm的替代品,它更像DHTML和ASP.NET。夸张一点说,如果要给微软的技术画个家谱的话,DHTML就是WPF的直系亲属。WPF里的大量核心概念和结构,如属性引擎、事件模型等,都是继承自DHTML,最大的一个不同是外观和控件逻辑的分离。WPF应用和DHTML应用(HTA)的相似性也非常大,不同点是WPF应用可以完全脱离IE。也就是说,WPF和网页、ASP.NET、SVG是一套体系,可以比作XML版的Flash,而和WinForm完全不同。WPF的长项应该是网页式应用,当然它也可以用来做别的东西,就像Ajax可以做在线文本编辑器一样。

也许有人还没听说过DHTML。DHTML即Dynamic HTML,是微软在90年代末在IE4里支持的扩展了的HTML,主要特征就是可以动态修改网页上对象的属性,而且具有类似Flash里的时间线,可以做动态的网页。缺点是难于开发和调试。后来主要被用来做翻转按钮。DHTML的一个页面集合和脚本资源一起可以打包成HTA应用,HTA应用可以在本机以及网络上使用。但从现在还有多少人记得DHTML就知道这东西没成才。

回到WPF,WPF只在XP和Vista上有完整的支持,在其他平台和浏览器下,微软提供了WPF/E(开发代号)。WPF/E的程序是非编译的,就是说是发布源码的,和HTML加JavaScript一样。另外WPF/E目前只支持JavaScript。那么,WPF/E能用来做什么应用大家也就心里明白了。要在WPF/E和Flash间选择的话,只要想想XML和压缩的二进制文件的区别就行了,现在几兆的Flash比比皆是,改用XML格式的话会有多大,诸位心里明白。不过要是个网页Form应用的话,WPF/E确实比Flash更强一些,不过有Ajax在,杀鸡未必要用牛刀。如果你的应用只支持XP和Vista,那么你可以得到WPF的全部优势。

WPF有三种应用模式:应用、浏览应用、文档应用。应用就是一般的窗口应用,浏览应用就是象网页一样的一页一页的应用,文档应用是用来显示内容的浏览应用功能子集,而不是MVC模型。一般应用其实也就是每个页面拥有一个独立的窗口。估计VB用户想到了当年的html控件,Delphi用户想到了IntraWeb。简单的理解就是把WinForm界面换成了网页,当然这个网页的功能比HTML强得多,也复杂得多。

WPF是一套很复杂的体系,它的界面可以用代码生成,不过绝大多数人都会用XAML来生成。XAML可以认为是WPF的HTML。制定标准的人总是说XML是可读的,但多数人认为它是用来给机器读的。XMAL基于XML,同时做了相当的扩展以弥补功能的不足。要手写XAML,必须了解WPF,了解XML(namespace,link等等),了解XAML的规则,了解XAML扩展的语法,能够记住大量的标识符和引用关系。就像今天人们大多不再手写HTML一样,人们大多不会愿意去手写更复杂的XAML。而且按照微软的设计目标,WPF要将界面设计和程序逻辑分开,交给不同的专业人员去做。也就是说,界面的设计是要交给美工的。相信我,找一个能够手写XAML的美工很难。微软为此提供了Expression系列软件,当然不是免费的。当然VisualStudio里也有一定程度的支持,但这意味着由程序员来做灵活复杂的界面,更容易做出丑陋的界面;或者让美工来用VisualStudio,功能有限而且有点昂贵。当然也可能有个不错的UI程序员,两全其美;或者老老实实地做简单朴素的界面,以后有机会再找美工润色。

程序员都喜欢谈论速度。WPF是可以硬件加速的,在DirectX 9级显卡和安装了较新的驱动的情况下,WPF会得到部分或完全的硬件加速。WinForm是基于GDI+的,没有硬件加速,只有v2.0里的非兼容模式下的文本是通过GDI加速的。所以,长远来说,WPF有更好的性能。

那么现在回到最初的问题,WPF和WinForm,赌注该压哪一边。编辑器类程序是难以移植到WPF的,如World、Excel、PowerPoint、Photoshop、IDE等。显示类和一般的商务类应用都是可以移植的,现有的Web应用都是可移植的。也就是说,WPF的应用范围和Ajax、Flash是有很大重合的,WPF的竞争力就是在和代码的集成上。随着Adobe加紧升级Flash的应用功能,一种可能的结果是WPF和Flash压缩了Ajax的生存空间,WPF/E没有获得足够的支持,WPF成为Windows专用的应用,Flash作为跨平台方案存在。而对WinForm程序来讲,嵌入一些WPF内容是容易的。在WPF前途未卜的情况下,WinForm仍然是目前一般应用最稳妥的途径。

http://blog.csdn.net/nightmare/article/details/1541844

WPF与WinForm的抉择的更多相关文章

  1. WPF与WinForm开发有什么区别?

    转自http://hi.baidu.com/leoliu83/blog/item/1d1a4a66dcb41134aa184cfd.html WPF开发于WinForm之后,从技术发展的角度,WPF比 ...

  2. WPF与Winform的选择

    最近公司计划对ERP系统全面升级,现有的ERP是简单的bs架构系统打算改版成cs.平时如自己写一些工具,小应用都是用winform就足够.但是界面总是很难看,据了解WPF在这一方面会强一些.因为之前对 ...

  3. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

  4. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfr ...

  5. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  6. WPF和Winform中picturebox图片局部放大

    原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...

  7. wpf和winform的区别

    深入浅出WPF(7)——数据的绿色通道,Binding(上) 水之真谛关注6人评论28117人阅读2008-06-23 02:40:00  http://liuteimeng.blog.51cto.c ...

  8. WPF 调用WinForm控件

    WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...

  9. WPF与winform与silverlight的区别

    收到了一封学生的邮件: =========================== 金老师您好: 最近在学C#.NET,基本语法学习的差不多了,接下来准备学习图形界面设计部分.但是我目前对于.NET的Wi ...

随机推荐

  1. URLDecoder和URLEncoder的使用总结

    其实,这两个类的使用并不复杂,URLDecoder和URLEncoder它的作用主要是用于普通字符串和application/x-www-form-rulencoded MIME字符串之间的转换,一般 ...

  2. 把搜狗输入法词库导入Google拼音输入法

    为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...

  3. ios 应用发布appStore

    1.进入管理界面开发商 [点击 iTunes Connect] 2.进入管理apps界面 [点击 Manage Your Apps] watermark/2/text/aHR0cDovL2Jsb2cu ...

  4. JavaCPP 技术使用经验总结

    本文是对 JNI 技术的一个补充方法,提出了替换 JNI.JNA 的一种开源技术.首先对 JavaCPP 技术进行简单介绍及对应于其他现有方案的介绍.对比.接下来,通过一个简单的示例让大家了解 Jav ...

  5. Arcgis api for javascript学习笔记(4.5版本)-三维地图并叠加天地图标注

    1.三维地图实现 在官网的demo中就有三维地图的实现,如下图所示 <!DOCTYPE html> <html> <head> <meta charset=& ...

  6. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. 【转】mybatis 一对一与一对多collection和association的使用

    转自:https://www.cnblogs.com/yansum/p/5819973.html (有修改和补充,红色字体部分)   在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单 ...

  8. OpenGL(十九) gluOrtho2D、glViewport、glutInitWindowSize区别与关系

    gluOrtho2D定义剪裁面,通过正交投影,把景物(模型)按照1:1的比例绘制到一个剪裁面上,相当于对世界坐标窗口的一个截取. glViewport定义视口,即视见窗口,是从世界坐标系窗口到屏幕坐标 ...

  9. sql service 游标和触发器的使用

    一. 定义游标 使用游标相当于C#里面的集合. ) DECLARE My_Cursor CURSOR --定义游标 FOR (select autoid from U_VoucherItems whe ...

  10. opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书

    问题1:根据源代码时,我发现的时候去敲门.不正确实施效果.哪里是不正确?没有源代码glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现最后的下一次抽奖提供 ...