在创建新的图形用户界面时,WPF是否比Windows Forms更受青睐?

47

大多数Windows窗体的限制和技巧对大多数程序员来说都是常见的。但是自从.NET 3.0之后,也可以使用WPF,即Windows Presentation Foundation。据说你可以更轻松地制作“性感应用程序”,并且在.NET 3.5 SP1上执行速度得到了良好的提升。

但是另一方面,很多事情在WPF中运作不同。我不会说它更困难,但你必须从头开始学习“所有”东西。

我的问题是:当你需要创建一个新的GUI,并且项目没有时间压力时,是否值得花费这些额外的时间呢?


WPF和Winforms之间有性能差异吗? - Marklar
4
是的,Winforms 在几乎所有方面都比 Tim 更快。 - Camilo Martin
@Camilo:我认为你的评论是误导性的。对于大多数事情,Winforms的速度大约比WPF快1.2倍。对于一些事情,它的速度是WPF的2倍。另一方面,对于许多事情,WPF实际上比Winforms更快,有时甚至戏剧性地更快(例如动画在WPF中可以轻松快10倍)。但我不知道有任何东西比WPF更快。 - Ray Burns
@Ray 这取决于您的显卡。对于常见控件,渲染矢量图形总是比将位图显示在屏幕上慢。至少我在几个WPF应用程序中看到了显著的性能下降(因为虚拟机没有使用图形卡),但我也可能错了。好处是,一旦掌握了抽象概念,WPF更适合开发人员(我现在就在学习)。此外,CPU每天都在变得更快(或者至少对于多线程代码是这样)。 - Camilo Martin
任何组件套件(例如DevExpress)在其WinForms版本中比WPF版本更快。包括重绘、响应速度和内存需求。 - Lex Lavnikov
34个回答

148

经过三个月的尝试,我试图在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解决方案不需要您的最终用户拥有带有良好图形硬件的现代桌面。


33
+1 我非常同意,总是很好听到有人在现实世界中真正尝试过技术并面对真实的压力。当工具和开发人员最终赶上时,WPF可能会在5年后变得非常优秀。即使那时,WinForms仍将存在。 - Ash
2
数据网格控件支持WPF 3.5 SP1中的列虚拟化。这应该可以解决它的性能问题。 - Tarnay Kálmán
过去我做了很多ASP3和ASP.NET的开发,现在我很欣赏使用XAML来设计我的用户界面。当我输入XAML时(在我的脑海中),我就可以看到UI,对我来说比使用UI设计工具更快...不过我是一名开发人员而不是设计师,这可能解释了一些问题。 - TimothyP
9
你使用的是Expression Blend还是VS.NET?VS.NET存在你提到的所有问题,但是Expression Blend是一个非常好的用于设计和布局WPF应用程序的工具。至少对于WPF开发来说,它与VS.NET相当,我甚至可以说它比VS.NET更好。在WPF早期,工具并不那么好用,但Expression Blend 2解决了你提到的所有问题。XAML始终是完全可编辑的,并且我从未遇到过崩溃或者因错误而“放弃”的情况。通过CollectionView和“/”特性,Master-Detail实际上已经内置了。 - Ray Burns

84

我已经使用WPF七个月了,现在它已经成为我的客户核心系统的一部分。我想和你分享一些关于学习和使用WPF作为业务演示平台的经验。

总的来说,我之前提到的评论仍然适用... WPF的设计时支持还没有到位。如果你急于推出一个富客户端应用程序,那就选择Windows Forms吧。毕竟,微软并不着急停止GDI / Windows Forms平台的支持,所以你可以相信未来相当长一段时间都会有良好的支持。

WPF不容易掌握,但这不应该是你决定是否投入时间和精力学习WPF的唯一考虑因素。尽管它目前不够成熟,但WPF建立在一些有用的、现代的概念上。

例如,在WPF中,你对编写良好的业务对象和可靠的验证逻辑的投资是一个稳固的投资。与Windows Forms不同,WPF的数据绑定充满了功能,使界面控件能够对无效的用户输入做出反应而无需编写GUI代码来检测这些错误。这是很有价值的。

WPF的样式和模板功能也被证明是有价值的。尽管普遍误解样式和模板的唯一用途是创建屏幕上的华丽效果,但事实上,这些功能显著简化了用户界面的编码,使之能够给出丰富的反馈 - 比如根据底层业务逻辑层的状态禁用/启用自己的按钮,或者根据光标下的对象状态智能地查找工具提示文本等等。

这些都是对于 "nothing fancy" 的业务应用程序非常有价值的功能,因为它们使得保持界面与底层数据一致变得容易。

简而言之:

  • 在Windows Forms中,你先设计你的用户界面,然后编写代码来驱动那个用户界面,通常也包括驱动你的数据对象的代码。
  • 在WPF中,你首先投资于驱动数据对象的业务层,然后设计一个界面,该界面能够监听您的数据对象。

这似乎是一个微小的差别,但它对您重复使用代码的能力有很大影响...这就引出了一个问题:"Windows Forms与WPF之争实际上是一项投资决策吗?"

(这似乎已成为我最喜欢的主题。)


1
当你做第一个WPF应用程序时,这确实是一项投资。我猜大多数第一个WPF项目都会由以前的WinForms程序员完成和估计,而且会拖延时间。在我看来,学习WPF非常值得,但问题是你的雇主是否也这样认为。 - SwissCoder

73

有没有使用WPF的强烈理由?

当然有! WPF非常不错!它拥有许多Windows Forms所缺乏的功能和能力,因此对于几乎任何项目都是一个重要的优势。

对于商业应用程序而言,最大的优点包括:

  • 出色的数据绑定和模板使其区别明显。一旦有了一个合适的数据模型,只需点击几下即可创建一个数据模板并使用Expression Blend进行拖放配置。绑定到颜色或形状等内容也很容易。
  • 屏幕布局非常灵活。在WPF中,所有内容都可以平滑地调整容器大小和形状变化,而且项目可以轻松地放大和旋转,甚至可以扩展到其包含的框架之外。
  • 普通对象可以以任何你喜欢的方式呈现,并且可以在不同的屏幕上轻松地具有不同的呈现方式,可以共享呈现,并且可以根据数据值的变化调整其呈现。
  • 如果需要打印,渲染到打印机也很容易。正确配置后,WPF使得Crystal ReportsSQL Server Reporting Services(SSRS)看起来就像是儿童玩具。
  • 你的用户界面将会看起来更加动态,包括很多不错的功能,比如在鼠标悬停时按钮可以动画显示。

对于实用程序和游戏,其他优点也变得突出:

  • 你可以轻松地添加形状、线条和任意绘图到应用程序中,而无需使用外部编辑器。这些组件的每个部分都可以进行数据绑定和动画处理,或者通过代码进行控制。在Windows Forms中,你通常只能导入位图并直接使用它,除非你想付出很多努力。
  • 动画很酷!只要不过度使用,用户会留下深刻的印象。它们也有助于让人们看清正在发生什么并减少突出显示的必要性。例如,在拖动对象时,您可以将目标设置为动画,以显示如果放置该对象会发生什么。
  • 颜色、渐变填充、笔刷、花哨字体、任意对象旋转、平铺笔刷等等,任何你想要的图形效果都可以轻松实现。
  • 极具自定义性。我需要为一个应用程序绘制铁路轨道,以便可以在上面放置火车。几个小时后,我就可以使用贝塞尔曲线在屏幕上的任何位置绘制铁路轨道,并且它们会自动连接和切换。
  • 总之,Windows Forms中可以构建的任何重要规模的GUI都可以在WPF中以三分之一(或更少)的工作量构建并且外观更好。

    WPF是否需要更多的资源(特别是RAM)

    与Windows Forms相比,确实需要付出一定的代价,但这是微不足道的。

    • RAM可以根据您的实现而上升或下降。 WPF以更高效的方式存储其数据,因此每个对象都较小,但在WPF中往往会有更多的对象,因此这样平衡出来,两者都可能领先。
    • CPU与Windows Forms相比会增加。根据我的经验,在屏幕上实际更新WPF对象需要的CPU约为普通Windows Forms渲染的两倍。 如果您的应用程序大部分时间都花费在更新屏幕上,那么WPF可能不适合您。 但是,在这种情况下,您也可能并没有使用Windows Forms:大多数严肃的游戏直接编写到DirectX中。
    • 与Windows Forms相比,WPF的磁盘使用量略少,因为它所需的代码比Windows Forms要少得多。 当然,数据的大小将保持不变。

    关于 CPU 的使用,有一点需要注意:在 WPF 中,动画和变换(如运动、平移等)比 Windows Forms 更加高效,因为它采用了保留模式存储。只是最初获取对象的过程较慢。

    维护开销

    在维护方面,WPF 比 Windows Forms 优势巨大。由于一切都可以用五分之一的代码完成,所以需要维护的内容也只有五分之一。此外,所有样板文件也都消失了,这样你就可以将精力集中在实际工作的代码上。

    XAML 的好处

    XAML 是 WPF 的核心。虽然可以不用 XAML 来使用 WPF,但使用 XAML 会更加容易。XAML 具有 HTML 的能力,可以轻松地指定用户界面,但其内置标签更加强大,而且可以轻松定义自己的标签。(实际上,这是很正常的做法)。

    XAML 的一些特殊优势:

    • 整个用户界面都在一个易于读取和操作的文本文件中定义,对于用户和工具来说都很容易
    • MarkupExtensions 允许以清晰简单的方式指定绑定
    • 类型转换器允许轻松地指定具有复杂类型的属性。例如,你可以说 Brush="Green",也可以指定一个具有三个停止点的径向渐变画刷。
    • 可以创建自己的元素
    • 可以轻松利用 WPF 强大的“附加属性”

    其他见解

    我多年来一直梦想着像 WPF 这样的东西。很多人已经实现了其中的部分功能,但能够在一个地方获得这些所有功能,而且价格只是(0 美元),这真是令人惊叹。

    WPF 对于 Windows Forms 来说是一个巨大的范式转变,需要一些时间来适应,但学习它所花费的时间将会多次回报自己。

    即使五年后,WPF仍然有一些缺点,但是一旦您体验过它的强大功能,它将完全让您惊叹不已。如果有人试图让您返回Windows Forms,您只会愤怒地拒绝。

    提示: - 获取Expression Blend进行开发 - 偶尔手动编辑XAML - 一开始可能感觉奇怪,不要放弃


    “包括一些不错的功能,例如当你将鼠标移到按钮上时会出现动画效果。” 你的意思是像Windows对任何普通按钮已经做的那样吗? - Joey
    3
    @ Johannes:不,我不这样认为。Windows只是在按钮上放置一个突出显示效果(而且这仅在按钮是普通按钮时才有效)。WPF可以做得更多。例如,当你将鼠标悬停在按钮上时,按钮可能会有一个门图标并向外打开,或者插入指针可能会出现在用户界面的其他位置。这种额外的丰富性在商业应用程序中非常有用,因为它增加了用户的生产力。 - Ray Burns

    72

    WPF使您能够完成一些惊人的事情,我非常喜欢它......但每当开发人员问我是否认为他们应该转向这项新技术时,我总是感到有必要限定我的建议。

    你的开发人员愿意(最好是热切地)花时间学习如何有效地使用WPF吗?在正常的产品开发周期内,“拾起”WPF可能不是一个好的选择,我从来没有想过会对MFC、Windows Forms甚至是非托管DirectX说出这样的话!

    你的团队中至少有一两个开发人员具备一定的设计敏感性,并且具有最终设计权限的人对开发问题具有相当的了解,这样你就可以利用WPF的功能创建出更好的东西,而不仅仅是更“花哨”,具有毫无意义的动画效果吗?

    你的目标客户群体中,是否有一定比例的用户运行集成显卡芯片,可能不支持你计划使用的功能,或者他们仍在运行Windows 2000,这将完全淘汰他们作为客户?有些人也会问,你的客户是否真的关心增强的视觉效果,但是我经历过上世纪90年代内部公司“我们的商业客户不关心颜色和图片”的争论,我知道来自你的竞争对手的精心设计的方案会让他们在意,真正的问题是是否具备条件,使您能够提供一些可以让他们立即关心的东西。

    项目是否需要从头开始开发,至少要涉及演示层,以避免尝试连接不兼容的遗留脚手架带来的额外复杂性(与Win Forms的Interop并不无缝)?

    您的经理是否能够接受(或被分心而没有注意到)四到六个月的开发人员生产率显著下降?

    我认为WPF的最后一个问题是由于其“FizzBin”特性导致的,它有十种不同的方式来实现任何任务,没有明显的理由偏好一种方法而不是另一种方法,并且很少有可用的指导来帮助您做出选择。不仅您所做出的选择的缺陷只有在项目后期才会变得清晰明了,而且您几乎可以确保每个参与您的项目的开发人员都会采取不同的方法,这将使维护工作变得非常麻烦。最让人沮丧的是那些经常使您犯错的不一致之处,当您尝试学习框架时。

    您可以在我的博客中找到更深入的与WPF相关的信息:

    http://missedmemo.com/blog/2008/09/13/WPFTheFizzBinAPI.aspx


    我很喜欢你指出集成图形芯片的问题。这个问题已经多次困扰了我们。痛苦,哦,痛苦。 - cplotts
    2
    我也喜欢你指出了WPF的“FizzBin”特性。实际上,有很多方法可以完成同一件事情,因此很难知道哪种方法是最好的(尤其是当你刚开始学习时)。如果我能给你两个大拇指,我会这么做的。回答得真好。 - cplotts

    62

    WPF需要Windows Vista或Windows XP SP2,这不是一个繁重的要求,但它是一个相关的要求。如果您想在Windows 2000上运行(有些人仍在使用),那么WPF将无法为您工作。

    WPF也是一项较新的技术,与Windows Forms相比还没有得到证明,因此您可能会选择Windows Forms作为较少风险的选项,特别是对于大型应用程序而言。

    话虽如此,WPF确实是未来。Visual Studio 2010正在以WPF进行重新编写,这可能是迄今为止最大的WPF应用程序,也将是对该技术的真正测试。

    显然,传统的Windows Forms应用程序将是另一种正确的选择情况。


    你有关于VS2010信息的链接吗? - Gad
    1
    只需在谷歌上搜索Visual Studio 2010 Wpf即可。一些示例:http://demiliani.com/blog/archive/2008/10/28/6520.aspxhttp://ayende.com/Blog/archive/2008/10/27/visual-studio-2010.aspx - Esteban Brenes
    如果是这样,我认为最好等待微软将其完成,学习经验,修复所有小问题并添加所有必要的扩展,以使其能够良好运行。 - gbjbaanb
    如果你看过Rico Mariani的博客,你会发现他们已经向WPF团队报告了许多错误、泄漏和性能问题。在我的看法中,让VS大量使用WPF是WPF的一个巨大进步。 - Judah Gabriel Himango
    顺便提一下,Windows 2000刚刚停止支持了(响起了过时的警钟):http://support.microsoft.com/ph/1131 - JBRWilkinson

    50

    正如其他人所说,无论你选择哪种方式都有优缺点。 WPF的优势包括:

    • 相对容易制作非常丰富的UI。
    • 更容易进行动画和特效处理。
    • 固有的可扩展性(在WPF应用程序上使用Windows Vista放大镜工具和在Windows表单应用程序上:请注意,在WPF应用程序中,所有矢量艺术都可以很好地缩放)。
    • (意见警告)我认为用WPF做文档导向系统“更容易”。

    然而,WPF也有一些缺点,Windows Forms则更加出色:

    • WPF的内置控件套件比Windows Forms限制得多。
    • 第三方控件空间对于Windows Forms更有支持。(当然这正在改变,但想一想:Windows Forms已经存在自2001年以来; WPF只有几年。由于时间的优势,Windows Forms在社区中有更多的支持。)
    • 大多数开发人员已经了解Windows Forms; WPF需要学习新技能。

    最后,记住,如果你付出努力(或使用正确的第三方工具),你可以使用任何一个工具创建出色、吸引人的UI。最终,在所有情况下,也不一定有更好的选择。根据项目需要选择正确的工具。


    10
    你说“WPF的内置控件套件比WinForms有限”这个表述可能会被误解。因为WPF的内置控件套件能够做得比WinForms更多,因为每个控件都可以进行模板化且具有多种用途。WinForms中的几乎所有内容都可以直接映射到简单的WPF中。然而,在最初发布的WPF版本(NET Framework 3.0)中确实缺少了三个WinForms所拥有的功能:DateTimePicker、NumericUpDown和DataGrid。这三个功能都可以轻松下载,此外最新的WPF版本(3.5 SP1)还添加了一个DataGrid到套件中。 - Ray Burns
    1
    此外,一些独立的WinForms控件具有某些缺失的功能,例如TextBox的自动完成功能。到了现在(2009年11月),针对所有这些问题已经发布了易于实施的解决方案。因此,不再有选择WinForms的理由,因为WPF缺少任何控件。如果WPF缺少您需要的供应商提供的控件,则仍然可以使用WinForms集成来使用该控件。 - Ray Burns
    3
    对我而言,WPF 的最大优势在于其数据绑定、模板和布局。 - Ray Burns
    4
    想一想:WinForms自2001年以来一直存在,但是自.NET 2.0以来没有得到发展。 - Thomas Levesque
    8
    了解答案撰写时间...一年多以前,这些都是正确的。现在,是的,我会毫不犹豫地选择WPF。 :) 翻译:了解答案发布时间......一年前,这个回答是完全准确的。现在,是的,我会立刻选择WPF。 :) - John Rudy

    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,请充分了解用于列表和网格的数据虚拟化。在 WPF 中,一个简单的数据绑定 ListItem 或 GridCell 最终会成为一个庞大的逻辑 + 可视化对象图表,如果你不学习如何进行虚拟化,则应用程序在大数据集上的性能将不佳。


    2
    感谢您的回来,重新访问并分享您的经验。我很感激。 - Stever B
    我有完全相同的经历。不幸的是,我还没有找到足够精确的信息来真正使用WPF实现这样的LOB应用程序。 - Marc

    18

    这两种技术各有优缺点。在一个带有“传统”用户界面的大型应用程序中,我会使用Windows Forms。在需要丰富用户界面(换肤、动画、更改用户界面)的应用程序中,我会选择WPF。请查看比较WPF和Windows Forms的文章


    Josh有很多实际经验,成功开发了WPF项目,包括纽约时报阅读器。链接加1。 - DK.

    18

    学习WPF需要很陡峭的学习曲线,我建议您先获取一些明显的书籍(Adam Nathan, Sells/GriffithsChris Anderson)和博客(Josh Smith等)。请做好准备,确保您的项目允许您有时间学习WPF。

    除了学习技术,还要花时间学习构建WPF应用程序所使用的模式。 Model View ViewModel (MVVM)似乎是获得广泛接受的一种模式。

    个人认为WPF是值得的,但请注意。此外,请注意您有效地将用户限制为Windows XP SP2+和Windows Vista。我们已经做出了这个决定,但您可能有一些不同的要求。


    15

    除了界面设计的灵活性外,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


    具备技术视角来补充设计视角,这是一个加分项。 - Robert Fraser
    有趣的是,GDI+ 对这些点有任何影响吗? - JBRWilkinson
    嗨,史蒂夫。非常好的观点,尽管我在GPU方面遇到了一些问题,发现我的应用程序的许多用户正在使用那些带有英特尔“假”GPU芯片的笔记本电脑,这会严重影响WPF的性能。 - Mark
    @JBR - 我不确定关于GDI+。 @Mark - 我知道你的意思,有些集成芯片真的很糟糕。 - Steve Wortham

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接