大多数Windows窗体的限制和技巧对大多数程序员来说都是常见的。但是自从.NET 3.0之后,也可以使用WPF,即Windows Presentation Foundation。据说你可以更轻松地制作“性感应用程序”,并且在.NET 3.5 SP1上执行速度得到了良好的提升。
但是另一方面,很多事情在WPF中运作不同。我不会说它更困难,但你必须从头开始学习“所有”东西。
我的问题是:当你需要创建一个新的GUI,并且项目没有时间压力时,是否值得花费这些额外的时间呢?
大多数Windows窗体的限制和技巧对大多数程序员来说都是常见的。但是自从.NET 3.0之后,也可以使用WPF,即Windows Presentation Foundation。据说你可以更轻松地制作“性感应用程序”,并且在.NET 3.5 SP1上执行速度得到了良好的提升。
但是另一方面,很多事情在WPF中运作不同。我不会说它更困难,但你必须从头开始学习“所有”东西。
我的问题是:当你需要创建一个新的GUI,并且项目没有时间压力时,是否值得花费这些额外的时间呢?
经过三个月的尝试,我试图在WPF上制作一款业务线(LOB)应用程序,但到了考虑回到Windows Forms的地步。在研究其他人的意见时,我看到了这个帖子......
是的,WPF是一项非常出色的技术,它的好处远不止于华丽的界面效果......模板化和绑定能力就是很好的例子。整个对象模型提供了更多的灵活性和广泛的可能性。然而,这并不意味着它是未来LOB应用程序的唯一平台。
WPF解决的“问题”——将GUI与业务逻辑分离——并不是Windows Forms无法通过正确的架构和思维方式轻松解决的问题。即使是WPF的对象路径绑定能力也可以在Windows Forms中使用一些非常简单的辅助类来实现。WPF的数据模板功能非常好用,但是在那些你绝对不知道屏幕上的任何部分要表示哪些对象的罕见情况下,它们也不是无法在Windows Forms中模拟的。
Windows Forms在成熟度方面领先。你几乎可以在Google上找到每一个解决Windows Forms问题的博客。相比之下,WPF的学习资源较少,可用的自定义控件也较少,并且没有解决其许多问题。
在做出WPF vs Windows Forms决策的高峰期,必须考虑开发环境的成熟度。Windows Forms编辑器流畅、反应迅速、直观易用。错误反馈立即到达,解决方案通常很明显,在Windows Forms中的编译->调试->编辑周期非常快。
WPF应用程序相比之下,在设计时支持方面相对较弱,设计视图在遇到错误后很容易退出,通常需要在修复后进行项目构建,然后设计师才愿意再次启动。从工具箱中拖放组件可能也不受支持,因为它在许多情况下要么根本不起作用,要么产生完全不直观的结果。尽管有WpfToolkit的承诺,但仍没有适用于WPF的可用DataGrid,其性能或设计时友好性都没有任何合理的表现。调试WPF应用程序有点像旧版ASP.NET调试范例...按F5 ->等待->启动->错误->停止->修复->按F5 ->等待->启动->错误->呻吟->停止->修复->按F5....您的程序正在运行的所有XAML都被锁定,追踪XAML特定问题通常很繁琐。
简而言之,Windows Forms的开发工具将使您以一小部分WPF应用程序所需的时间创建前端...尤其是如果您正在创建主细节网格或类似电子表格的界面,则大多数LOB都有。使用Windows Forms,您已经完成了90%的工作。
我非常喜欢WPF架构,只是希望设计时工具集不像预阿尔法调试版本。
编辑:这个答案发布于.NET 3.5 + Visual Studio 2008,但.NET 4.0与Visual Studio 2010一起发布了WPF数据网格。虽然新的WPF开发经验已经做出了许多改进,但我的答案没有改变,我想添加以下建议:
如果您急于进行RAD开发,请使用Windows表单。如果您要制作一个良好的架构,可维护,可扩展,资源友好的多用户业务线应用程序,请考虑ASP.NET MVC+HTML 5+jQuery…我使用这些技术的项目为我的客户带来更好的结果,更快。MVC提供与WPF相同的所有模板,而jQuery则启用动画和复杂交互。更重要的是,ASP.NET MVC + jQuery解决方案不需要您的最终用户拥有带有良好图形硬件的现代桌面。
我已经使用WPF七个月了,现在它已经成为我的客户核心系统的一部分。我想和你分享一些关于学习和使用WPF作为业务演示平台的经验。
总的来说,我之前提到的评论仍然适用... WPF的设计时支持还没有到位。如果你急于推出一个富客户端应用程序,那就选择Windows Forms吧。毕竟,微软并不着急停止GDI / Windows Forms平台的支持,所以你可以相信未来相当长一段时间都会有良好的支持。
WPF不容易掌握,但这不应该是你决定是否投入时间和精力学习WPF的唯一考虑因素。尽管它目前不够成熟,但WPF建立在一些有用的、现代的概念上。
例如,在WPF中,你对编写良好的业务对象和可靠的验证逻辑的投资是一个稳固的投资。与Windows Forms不同,WPF的数据绑定充满了功能,使界面控件能够对无效的用户输入做出反应而无需编写GUI代码来检测这些错误。这是很有价值的。
WPF的样式和模板功能也被证明是有价值的。尽管普遍误解样式和模板的唯一用途是创建屏幕上的华丽效果,但事实上,这些功能显著简化了用户界面的编码,使之能够给出丰富的反馈 - 比如根据底层业务逻辑层的状态禁用/启用自己的按钮,或者根据光标下的对象状态智能地查找工具提示文本等等。
这些都是对于 "nothing fancy" 的业务应用程序非常有价值的功能,因为它们使得保持界面与底层数据一致变得容易。
简而言之:
这似乎是一个微小的差别,但它对您重复使用代码的能力有很大影响...这就引出了一个问题:"Windows Forms与WPF之争实际上是一项投资决策吗?"
(这似乎已成为我最喜欢的主题。)
有没有使用WPF的强烈理由?
当然有! WPF非常不错!它拥有许多Windows Forms所缺乏的功能和能力,因此对于几乎任何项目都是一个重要的优势。
对于商业应用程序而言,最大的优点包括:
对于实用程序和游戏,其他优点也变得突出:
总之,Windows Forms中可以构建的任何重要规模的GUI都可以在WPF中以三分之一(或更少)的工作量构建并且外观更好。
WPF是否需要更多的资源(特别是RAM)
与Windows Forms相比,确实需要付出一定的代价,但这是微不足道的。
关于 CPU 的使用,有一点需要注意:在 WPF 中,动画和变换(如运动、平移等)比 Windows Forms 更加高效,因为它采用了保留模式存储。只是最初获取对象的过程较慢。
维护开销
在维护方面,WPF 比 Windows Forms 优势巨大。由于一切都可以用五分之一的代码完成,所以需要维护的内容也只有五分之一。此外,所有样板文件也都消失了,这样你就可以将精力集中在实际工作的代码上。
XAML 的好处
XAML 是 WPF 的核心。虽然可以不用 XAML 来使用 WPF,但使用 XAML 会更加容易。XAML 具有 HTML 的能力,可以轻松地指定用户界面,但其内置标签更加强大,而且可以轻松定义自己的标签。(实际上,这是很正常的做法)。
XAML 的一些特殊优势:
其他见解
我多年来一直梦想着像 WPF 这样的东西。很多人已经实现了其中的部分功能,但能够在一个地方获得这些所有功能,而且价格只是(0 美元),这真是令人惊叹。
WPF 对于 Windows Forms 来说是一个巨大的范式转变,需要一些时间来适应,但学习它所花费的时间将会多次回报自己。
即使五年后,WPF仍然有一些缺点,但是一旦您体验过它的强大功能,它将完全让您惊叹不已。如果有人试图让您返回Windows Forms,您只会愤怒地拒绝。
提示: - 获取Expression Blend进行开发 - 偶尔手动编辑XAML - 一开始可能感觉奇怪,不要放弃
WPF使您能够完成一些惊人的事情,我非常喜欢它......但每当开发人员问我是否认为他们应该转向这项新技术时,我总是感到有必要限定我的建议。
你的开发人员愿意(最好是热切地)花时间学习如何有效地使用WPF吗?在正常的产品开发周期内,“拾起”WPF可能不是一个好的选择,我从来没有想过会对MFC、Windows Forms甚至是非托管DirectX说出这样的话!
你的团队中至少有一两个开发人员具备一定的设计敏感性,并且具有最终设计权限的人对开发问题具有相当的了解,这样你就可以利用WPF的功能创建出更好的东西,而不仅仅是更“花哨”,具有毫无意义的动画效果吗?
你的目标客户群体中,是否有一定比例的用户运行集成显卡芯片,可能不支持你计划使用的功能,或者他们仍在运行Windows 2000,这将完全淘汰他们作为客户?有些人也会问,你的客户是否真的关心增强的视觉效果,但是我经历过上世纪90年代内部公司“我们的商业客户不关心颜色和图片”的争论,我知道来自你的竞争对手的精心设计的方案会让他们在意,真正的问题是是否具备条件,使您能够提供一些可以让他们立即关心的东西。
项目是否需要从头开始开发,至少要涉及演示层,以避免尝试连接不兼容的遗留脚手架带来的额外复杂性(与Win Forms的Interop并不无缝)?
您的经理是否能够接受(或被分心而没有注意到)四到六个月的开发人员生产率显著下降?
我认为WPF的最后一个问题是由于其“FizzBin”特性导致的,它有十种不同的方式来实现任何任务,没有明显的理由偏好一种方法而不是另一种方法,并且很少有可用的指导来帮助您做出选择。不仅您所做出的选择的缺陷只有在项目后期才会变得清晰明了,而且您几乎可以确保每个参与您的项目的开发人员都会采取不同的方法,这将使维护工作变得非常麻烦。最让人沮丧的是那些经常使您犯错的不一致之处,当您尝试学习框架时。
您可以在我的博客中找到更深入的与WPF相关的信息:
WPF需要Windows Vista或Windows XP SP2,这不是一个繁重的要求,但它是一个相关的要求。如果您想在Windows 2000上运行(有些人仍在使用),那么WPF将无法为您工作。
WPF也是一项较新的技术,与Windows Forms相比还没有得到证明,因此您可能会选择Windows Forms作为较少风险的选项,特别是对于大型应用程序而言。
话虽如此,WPF确实是未来。Visual Studio 2010正在以WPF进行重新编写,这可能是迄今为止最大的WPF应用程序,也将是对该技术的真正测试。
显然,传统的Windows Forms应用程序将是另一种正确的选择情况。
正如其他人所说,无论你选择哪种方式都有优缺点。 WPF的优势包括:
然而,WPF也有一些缺点,Windows Forms则更加出色:
最后,记住,如果你付出努力(或使用正确的第三方工具),你可以使用任何一个工具创建出色、吸引人的UI。最终,在所有情况下,也不一定有更好的选择。根据项目需要选择正确的工具。
WPF的编程模型比Windows Forms更加开放和灵活,但像ASP.NET MVC一样,在正确实现Model-View-ViewModel模式方面需要更多的纪律。
我的第一个 WPF 的 LOB 应用程序最终以彻底失败告终,因为它是一个资源狂魔,使我的终端用户的低端笔记本电脑完全停顿......这最终是因为我使用了 WPF + LINQ to SQL , 并期待有好的结果... 这就是 WPF 与 Windows Forms 相比差别如此之大的地方...在 Windows Forms 中,你可以通过这种方式获得成功。WPF 比 Windows Forms 更重量级,如果你不构建精简的应用程序,你会得到一个800斤大猩猩。
不要回避 WPF...探索它。但要注意的是, 在Windows Forms编程中可接受的错误,在 WPF 中可能导致糟糕的结果。它们是根本不同的引擎,适用于根本不同的编程模式。
最后要说的是:如果你决定使用 WPF,请充分了解用于列表和网格的数据虚拟化。在 WPF 中,一个简单的数据绑定 ListItem 或 GridCell 最终会成为一个庞大的逻辑 + 可视化对象图表,如果你不学习如何进行虚拟化,则应用程序在大数据集上的性能将不佳。
这两种技术各有优缺点。在一个带有“传统”用户界面的大型应用程序中,我会使用Windows Forms。在需要丰富用户界面(换肤、动画、更改用户界面)的应用程序中,我会选择WPF。请查看比较WPF和Windows Forms的文章。
学习WPF需要很陡峭的学习曲线,我建议您先获取一些明显的书籍(Adam Nathan, Sells/Griffiths和 Chris Anderson)和博客(Josh Smith等)。请做好准备,确保您的项目允许您有时间学习WPF。
除了学习技术,还要花时间学习构建WPF应用程序所使用的模式。 Model View ViewModel (MVVM)似乎是获得广泛接受的一种模式。
个人认为WPF是值得的,但请注意。此外,请注意您有效地将用户限制为Windows XP SP2+和Windows Vista。我们已经做出了这个决定,但您可能有一些不同的要求。
除了界面设计的灵活性外,WPF 还具有一些技术优势:
1.) WPF 不依赖于 GDI 对象。 嗯,我认为它仅在窗口实例本身使用 2 个 GDI 对象,但那几乎不算什么。我曾在一个非常大的内部 Windows Forms 应用程序中参与过一定程度的工作。我们办公室的人有时会同时运行 3 或 4 个实例。问题是他们经常遇到 Windows 2000、XP 和 Vista 固有的 10,000 个 GDI 对象限制。当发生这种情况时,整个操作系统就会变得无响应,并且你会开始看到视觉上的瑕疵。唯一解决的方法是关闭应用程序。
2.) WPF 利用 GPU。 WPF 能够将部分 UI 处理卸载到 GPU 是非常出色的。我只期望它的这个方面随着时间的推移而变得更加优秀。作为一名以前的 OpenGL 爱好者,我很欣赏 GPU 带来的强大力量。我的100美元显卡每秒可以运行112个时钟速度为1.5 GHz的核心(这并不是顶级产品)。这种并行处理能力可以让任何四核 CPU 望尘莫及。
但是,WPF 还是相当新的。它无法在 Windows 2000 上运行。实际上,一个 WPF 应用程序在重启后可能会启动缓慢。我在我的博客上谈到了所有这些内容:http://blog.bucketsoft.com/2009/05/wpf-is-like-fat-super-hero.html