大多数程序员都会使用Windows窗体的大多数限制和技巧。但是从.NET 3.0开始,还有WPF可用,Windows Presentation Foundation。据说你可以用它来使“性感应用程序”变得更加容易,并且使用.NET 3.5 SP1可以提高执行速度。
但另一方面,很多事情与WPF有所不同。我不会说这更难,但你必须从头开始学习“一切”。
我的问题:当你必须创建一个新的GUI并且项目没有时间压力时,是否值得花费额外的时间?
答案 0 :(得分:148)
在尝试在WPF上发布line-of-business(LOB)应用程序三个月之后,我开始考虑为我的项目转回Windows Forms,并在研究其他人的意见时遇到了这个问题...
是的,WPF是一项卓越的技术,它的优势远远超出了仅仅是眼花缭乱...模板和绑定功能就是很好的例子。整个对象模型提供更多灵活性和更广泛的可能性。但是,这并不能成为未来LOB应用程序的事实平台。
WPF在将GUI与业务逻辑分离方面解决的“问题”不是通过简单地从正确的架构和思维方式开始就无法在Windows窗体中轻松解决的问题。甚至WPF的对象路径绑定功能也可以在Windows窗体中使用一些非常简单的辅助类来重现。 WPF的数据模板功能非常好,但是在极少数情况下,当你完全不确切地知道你将在任何给定部分代表什么对象时,它们在Windows窗体中无法模拟。屏幕。
Windows Forms在未来的竞争中取决于成熟度。你不能在没有某人博客解决Windows窗体问题的博客上摇摆死猫。另一方面,WPF的学习资源相对较少,可用的自定义控制较少,并且没有解决许多出牙问题。
在制作WPF与Windows Forms决策的高峰期必须成为开发环境的成熟。 Windows窗体编辑器具有灵活性,响应性和直观性。有关错误的反馈会立即显示,解决方案通常很明显,Windows窗体中的compile-> debug->编辑周期非常快。
另一方面,WPF应用程序具有相对可怜的设计时间支持,设计视图在第一次遇到错误时已经准备就绪,在设计者愿意之前通常需要在修复之后进行项目构建再来一次。从工具箱中拖出组件可能也不受支持,因为它在很多情况下根本不起作用,或者产生完全不直观的结果。尽管有WpfToolkit的承诺,但仍然没有可用于WPF的DataGrid产生任何类型的合理性能或设计时间友好性。调试WPF应用程序有点像旧 ASP.NET调试范例...点击 F5 - >等待 - >发布 - >错误 - >停止 - >修复 - >点击 F5 - >等待 - >发布 - >错误 - >呻吟 - >停止 - >修复 - >点击 F5 ....程序运行的所有XAML都被锁定,跟踪XAML特定问题通常很乏味。
简而言之,最重要的是,Windows窗体的开发工具将在WPF应用程序的一小部分时间内打开前端...... 尤其是你正在创建大多数LOB拥有的主 - 细节网格或类似接口的电子表格。使用Windows Forms,您可以从已经完成的90%的工作开始。
我是WPF架构的忠实粉丝。我只是希望设计时工具集不像是一个pre-alpha debug-build。
编辑:这个答案是关于.NET 3.5 + Visual Studio 2008发布的,但带有Visual Studio 2010的.NET 4.0附带了WPF数据网格。虽然对新的WPF开发体验进行了许多改进,但我的答案仍未改变,我想补充以下建议:
如果您急于进行RAD开发,请使用Windows窗体。如果您希望生成一个构建良好,可维护,可扩展,资源友好,多用户的业务线应用程序,请考虑ASP.NET MVC + HTML 5 + jQuery ...我使用这些技术的项目已经取得了更好的成果为我的客户提供更快的结果。 MVC提供了与WPF相同的模板,jQuery支持动画和复杂的交互。更重要的是,ASP.NET MVC + jQuery解决方案不要求最终用户拥有具有不错图形硬件的现代桌面。
答案 1 :(得分:84)
我已经有七个月的时间使用WPF了解现在已成为我的客户的核心系统,我想与您分享更多关于学习和使用WPF作为业务线演示平台的经验的想法
总的来说,我上面的评论仍然有效...... WPF的设计时间支持还没有。如果您急于将富客户端应用程序推出门外,请使用Windows Forms。期。微软并不急于停止使用GDI / Windows Forms平台,因此您可以在未来的公平时间内获得良好的支持。
WPF并不容易掌握,但这不应该是您决定是否将时间和精力用于学习WPF的决定。尽管目前还缺乏成熟度,但WPF是围绕一些有用的现代概念构建的。
例如,在WPF中,您对具有良好验证逻辑的精心编写的业务对象的投资是一项可靠的投资。与Windows Forms不同,WPF的数据绑定功能允许接口控件对无效的用户输入做出反应,而无需编写GUI代码来检测这些错误。这很有价值。
WPF中的样式和模板功能也被证明是有价值的。尽管人们普遍存在一种误解,认为造型和模板的唯一用途是创建屏幕上的视觉效果,但事实是这些功能大大简化了用户界面的编码,提供了丰富的反馈 - 比如禁用/启用自身的按钮基础业务逻辑层的状态,或基于光标下对象状态智能查找文本的工具提示等。
这些都为“没什么好看的”业务应用程序添加了非常有价值的功能,只是因为它们可以很容易地使接口与底层数据保持一致。
简而言之:
这是一个看似微妙的差异,但它对您重用代码的能力产生了巨大的影响......这引出了一个问题:“Windows Forms与WPF问题实际上是投资决策吗?”
(这似乎已成为我最喜欢的主题。)
答案 2 :(得分:74)
答案 3 :(得分:72)
WPF让你做了一些令人惊奇的事情,我喜欢它......但每当开发人员问我是否认为他们应该采用新技术时,我总是觉得有资格获得我的推荐资格。
您的开发人员是否愿意(最好是EAGER)花时间学习有效使用WPF?我从来没有想过要对MFC,Windows Forms,甚至是非托管DirectX这么说,但你可能不希望团队试图在普通开发过程中“接收”WPF。运输产品的周期!
至少有一两个开发人员具有一定的设计敏感性,并且具有最终设计权限的人员对开发问题有一个很好的理解,因此您可以利用WPF功能创建实际上更好的东西,而不仅仅是更多“多彩”,以无偿动画为特色?
您的目标客户群的某些百分比是否在可能不支持您计划的功能的集成图形芯片组上运行 - 或者他们是否仍在运行Windows 2000,这会将客户完全消除?有些人还会问你的客户是否真正关注增强的视觉效果,但是,在90年代早期通过内部公司“我们的商业客户不关心颜色和图片”的争论,我知道竞争对手精心设计的解决方案会让他们关心,真正的问题是条件是否正确,让你能够提供让他们现在关心的东西。
项目是否涉及基础开发,至少对于表示层,以避免尝试挂钩到不兼容的传统脚手架的额外复杂性(与Win Forms的Interop不是无缝的)?
您的经理可以接受(或分散注意力)在开发人员工作效率方面的重要DROP四到六个月吗?
最后一个问题是由于我喜欢将其视为WPF的“FizzBin”性质,有十种不同的方式来实现任何任务,并且没有明显的理由偏好一种方法来实现另一种方法,并且没有什么指导可以帮助你做出选择。您所做出的任何选择的缺点不仅会在项目的后期很明显,而且几乎可以保证您的项目中的每个开发人员采用不同的方法,从而导致严重的维护问题。最令人沮丧的是当你试图学习框架时,不断惹恼你的不一致。
您可以在我的博客上的条目中找到更多与WPF相关的详细信息:
答案 4 :(得分:62)
WPF需要Windows Vista或Windows XP SP2,这不是一个繁重的要求,但它是一个相关的要求。如果你想在Windows 2000(有些人仍然这样做)上运行,那么WPF将不适合你。
WPF也是一种较新的技术,并不像Windows Forms那样经过验证,因此您可以选择Windows Forms作为风险较小的选项,尤其是对于大型应用程序。
话虽如此,是的,WPF是未来。 Visual Studio 2010正在WPF中重写,它可能是迄今为止最大的WPF应用程序,它也将是该技术的真正测试。
显然,传统的Windows窗体应用程序将是另一种情况,它是正确的选择。
答案 5 :(得分:51)
正如其他人所说,无论你走到哪里,都有优点和缺点。正如其他人所说,WPF的优势包括:
然而,WPF存在一些缺点,其中Windows窗体名列前茅:
最后,请记住,如果您开展工作(或使用正确的第三方工具),您可以在任一工具中创建出色,有吸引力且引人入胜的用户界面。在一天结束时,在所有情况下都不一定更好。使用对项目感觉合适的东西。
答案 6 :(得分:24)
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,请熟悉数据虚拟化,以便与列表和网格一起使用。什么是简单的数据绑定ListItem或GridCell最终成为WPF中的一个重要的逻辑+可视对象 - 图形,如果您不学习如何虚拟化,您的应用程序将无法在大型数据集上表现良好。
答案 7 :(得分:18)
WPF有一个非常陡峭的学习曲线,我建议你先得到明显的书籍(Adam Nathan, Sells/Griffiths,和 Chris Anderson)和 博客(Josh Smith等)。做好准备,确保你的项目让你有时间学习WPF。
除了学习该技术外,还要花些时间学习用于构建WPF应用程序的模式。 Model View ViewModel(MVVM)似乎已经获得了很多人的认可。
就个人而言,我认为WPF值得,但需要预先警告。另请注意,您有效地将用户限制为Windows XP SP2 +和Windows Vista。我们做出了这个决定,但您可能会有一些不同的要求。
答案 8 :(得分:18)
这两种技术各有利弊。在具有“经典”UI的大型应用程序中,我使用Windows窗体。在需要丰富用户界面(皮肤,动画,更改用户界面)的应用程序中,我选择WPF。请查看文章 WPF vs. Windows Forms ,比较WPF和Windows窗体。
答案 9 :(得分:15)
除了UI设计的灵活性之外,WPF还有一些技术优势:
1.。)WPF不依赖于GDI对象。好吧,我认为它使用2个GDI对象作为窗口本身的实例,但实际上没什么。我已经在一个非常大的内部Windows窗体应用程序中涉及到一定程度。我们办公室的人有时会同时运行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
答案 10 :(得分:14)
我认为值得学习WPF。一旦你达到速度,你的表单上的设计工作就会容易得多。我不会太担心“性感”的东西。大多数情况只是一种时尚。您可以在WPF中快速轻松地制作“普通”Winforms风格的应用程序。
整个概念有助于更容易地设计IMO。
答案 11 :(得分:13)
我不同意这里的一些答案。 WPF非常适合line of business(LOB)应用程序。 (青蛙设计LOB客户端就是最好的例子)。除了让您的用户界面显眼的可能性(在商业应用程序中不是必需的)之外,WPF还为您提供了更多功能。
数据绑定和模板功能仅优于Windows窗体。它还提供了一种更好的分离代码和表示的方法。 我们已经成功地将WPF用于2个LOB应用程序,团队成员不超过2-3个。
您将面临的最大问题可能是WPF的陡峭学习曲线(与Windows Forms相比),这将降低开发速度,而开发人员不习惯使用WPF。
答案 12 :(得分:11)
我们目前正在从Windows Forms重写WPF中的应用程序。是的,有一个陡峭的学习曲线,你必须“重新学习”一些东西,但它是如此值得。结合WCF,我们发现我们编写的代码更少,更快,更强大。
坚持一段时间,阅读Adam Nathan's book,然后查看不断增长的第三方控件库,例如来自Telerik和ComponentOne的控件。在我看来,一个消极的是,设计工具Expression Blend使用起来非常尴尬。最新版本仍处于测试阶段,但对于我们这些使用Visual Studio多年的人来说,这感觉不对。是的,它主要面向设计师,但有些事情在Visual Studio中无法做到。
答案 13 :(得分:9)
考虑WPF,如果界面设计对您很重要,因为WPF可以提供更好的UI体验。但是,Windows Forms在其发展方面具有多年的发展历史,因此它已被证明有效,您可以在该平台上找到许多精通程序员。
此外,可移植性可能也是一个问题,WPF仅适用于Windows XP SP2及更高版本。
此外,WPF的学习曲线陡峭,这意味着如果没有特定的WPF经验,提供高质量的产品并不容易。
答案 14 :(得分:8)
嗯,一个答案是“当你必须支持1.1或2.0时”,因为WPF是.NET 3.0的一部分。 WPF存在已知的操作系统限制,并且存在一个明显的技能问题:如果您有一个知道winforms的开发人员团队,那么使用 winforms生成健壮的代码可能会更容易。但是,如果您正在编写大量的UI代码,那么在某些时候开始选择WPF可能是值得的。
WPF与Silverlight有许多共同点,因此它具有可转让的好处。
答案 15 :(得分:8)
WPF具有许多优点,例如卓越的数据绑定功能, 关注点分离,设计和逻辑分离等......
作为开发人员,我喜欢使用XAML定义我的UI而不是 与Windows窗体设计师联系在一起,我知道我可以数数 另一位设计师让我的应用看起来很棒。
我个人不关心不支持旧版本的Windows, 但WPF的一大问题是(现在/曾经)不支持 by Mono(http://www.mono-project.com)所以WPF应用程序不能在Mac OS或Linux上运行。 (Altough Silverlight应用程序将)。
如果您有时间和资源来投资学习WPF,那就去做吧! 即使您要编写Silverlight应用程序来支持多个操作系统。
如果您需要桌面应用程序在多个操作系统上使用SWF运行。
答案 16 :(得分:7)
有许多不同之处。我们喜欢WPF:
但是,我们坚持使用Windows Forms,因为:
答案 17 :(得分:6)
决定使用哪一个时,最重要的考虑因素是考虑目标受众安装的.NET Framework。我发现更多的人拥有只支持Windows Forms的较低.NET Framework版本,但这只是我的个人经历。
答案 18 :(得分:5)
WPF使表单设计工作更容易交给真正的设计师,而不是设计师服装的开发人员。如果那是你想做的事情,那么WPF就是你的答案。如果经典的Windows样式按钮很好,那么Windows Forms可能就是这样。
(多个答案声称如果界面设计对您来说很重要,您应该使用WPF,但这非常模糊。界面设计总是“重要的”。)
答案 19 :(得分:5)
WPF的优势在于使用自定义控件和动画创建外观漂亮的GUI要容易得多。 WPF还有助于进一步显示表示层和逻辑层。如果你有设计师,它允许你将这项工作的95%用于非编码器,并允许编码人员处理逻辑。缺点是Expressions Blend的软件成本,以及缺少任何Visual Studio代码分析工具都运行良好,因为它们在尝试渲染XAML时往往会陷入框架调用中。我相信还有其他人,但这些是我们真正看到的唯一两个。
主要考虑因素是您是否希望您的客户必须安装.NET 3.0或更好的.NET 3.5 SP1。你会得到一些反复的反馈
答案 20 :(得分:4)
如果您拥有MSDN许可,请查看Expression tools。它专为WPF设计,直接导出到Visual Studio,它可能有助于简化您的过渡。
答案 21 :(得分:3)
如果您只关心支持Windows并且不介意学习它所花费的时间,请使用WPF。它快速,灵活,易于重新设计,并具有很好的工具来使用它。
答案 22 :(得分:3)
WPF中的文本呈现存在已知问题。许多用户报告说,大量使用抗锯齿和像素混合会导致文本模糊。在某些情况下,这是一个很大的破坏者,据我所知,微软在某种程度上已经承认了这一点。
答案 23 :(得分:3)
在过去的3年半里,我一直在做Windows Forms开发(两家公司)。这两个应用程序都被广泛使用,最终出现了GDI问题。大型Windows窗体应用程序最终会耗尽GDI资源 - 导致最终用户不得不重新启动。
答案 24 :(得分:3)
作为副作用,Silverlight基于WPF,从任何一个开始都可以让你获得与另一个合作的知识。如果事情继续基于网络,拥有先前的知识(和现有代码库)可以轻松地传输到浏览器(或Windows Live Mesh)可能有助于为您的软件提供额外的生命。
答案 25 :(得分:3)
如果您决定使用WPF,考虑到上述答案中已经解释过的优缺点,我强烈建议您仔细阅读dnrTV episode with Billy Hollis
答案 26 :(得分:3)
在DotNetRocks episode 315中,Brian Noyes对此进行了广泛的讨论。
答案 27 :(得分:2)
Scott is complaining about Expression Blend以及它作为开发者对他没有意义。我对Expression Blend的第一反应就是这样。但是,现在我认为它是一个非常宝贵的工具,但它实际上取决于你是什么类型的开发人员。
我是必须执行Integrator角色的用户界面开发人员,我最终发现Expression Blend非常有价值,可以以所见即所得的方式创建样式和控制模板。我几乎总是让Expression Blend和Visual Studio在同一个项目上同时运行。
我还认为在Expression Blend中玩游戏并查看吐出的XAML是学习WPF API的绝佳方式......就像在Windows窗体中使用设计器并检查它吐出的C#代码有助于学习如何使用你在那里设计的任何东西。
Expression Blend很有帮助。试试吧,特别是如果您正在处理应用程序的视觉效果。
答案 28 :(得分:2)
来自an earlier post from Mark的引用:
- 在Windows窗体中,您可以设计用户界面,然后编写代码来驱动该用户界面,该界面通常还包括驱动数据对象的代码。
- 在WPF中,您投资于驱动数据对象的业务层,然后设计一个侦听数据对象的接口。
我认为这更像是一种设计选择,而不是您是否使用Windows窗体或WPF。但是,我可以理解某些技术可能更适合特定方法。
答案 29 :(得分:1)
WPF通过XAML支持声明性UI,丰富的控件模板和样式以及Expression Blend等工具,使设计人员能够与同一项目的开发人员合作更好。此外,它为开发人员提供了附加依赖属性的灵活性和极其强大的数据绑定。此外,Silverlight支持XAML的子集以及与WPF相同的控制类,因此您的应用程序可以轻松移植到RIA。
我会在任何一天选择WPF而不是Windows Forms。即使目标计算机只有.NET 2.0,如果用户可以安装其他程序,新的.NET Framework Client配置文件也可以很容易地部署WPF应用程序。
我决定坚持使用Windows Forms的唯一原因是,该产品将部署在被锁定且仅具有.NET 2.0或.NET 1.1的计算机上。
答案 30 :(得分:1)
只有您没有WPF专业知识并且您不想投资它:)
答案 31 :(得分:0)
对于转换项目(来自Visual Basic 6.0),很难让团队切换到WPF。除了学习曲线,人们已经习惯了旧的界面。 Windows Forms虽然被逐步淘汰,但仍将存在很长时间。
答案 32 :(得分:0)
我使用Winforms来快速证明概念,因为虽然它对于真正的应用程序来说很糟糕,但对于“Visual Basic 6.0”风格的快速原型设计非常有用。
所以,这里有一个例子:
如果我需要跟踪流程的多个步骤(例如下载内容,计算/转换,创建智能输出)并使所有内容都可重现,我通常会使用ListBox和几个按钮创建一个快速表单。< / p>
由于我是一名真正的开发人员,因此无论如何逻辑都已经在视图以外的类中了,所以这是一个很好的起点。
答案 33 :(得分:0)
使用WPF为您提供了在很大程度上自定义应用程序的方法。您可以非常快速地编写代码,即在几秒钟内创建像文本框一样的自定义控件,并自定义各种属性,如内容样式等,最好的部分是UI美,即动画,触发器等图形。但它需要良好的硬件规格和一些仅在Windows Vista和Windows 7中可用的特殊功能。
Windows窗体没有真正重要的丰富功能,否则我们可以使用WPF创建任何类型的应用程序。
Windows窗体和WPF是一个不同的物种,它们都取决于项目要求,即客户或用户想要的东西。