Windows Forms技术已经过时了吗?

28
现在是为我的项目编写GUI的时候了,我想知道应该使用什么技术。我大部分的.NET GUI开发都是在.NET 1和2中完成的,所以我比较熟悉Windows Forms。我有点了解WPF,但还没有尝试去深入了解它。
Windows Forms已经死亡或正在消亡吗?学习WPF是一个好选择吗?它是未来,只是一个阶段,还是一种可以与Windows Forms并存的技术?
此外,任何经验都很有用,特别是那些广泛使用两种框架的人。您如何在这两个框架中实现类似功能的?
11个回答

47

WinForms是死了还是濒临死亡?

不是。它没有得到显着的进一步发展(即没有新的主要添加),但在.NET 4中得到了完全支持,例如。

WPF是学习的好技术吗?

是的。

它是未来,只是一个阶段,还是可以与WinForms并肩前行的技术?

计划最终转移到WPF,但也理解存在大量现有的用WinForms编写的代码库,并且没有重写为WPF的业务案例。因此,WinForms仍然得到支持。

另外,任何经验都很好听,特别是那些广泛使用过两者的人。您如何在这两个框架中实现类似功能的体验?

总的来说,WPF更具表现力。如果将框架看作一组乐高积木,可以以各种方式组合WinForms积木较大 - 每个积木都做很多事情 - 因此可供组合的方式较少。当您需要某些-但不完全像现有积木所做的那样时,通常必须从头开始编写自己的积木。在WPF中,积木要小得多,并且可以以许多有趣甚至令人惊讶的方式组合。

作为一个具体的例子,请考虑WPF Button是一个容器,可以托管任意内容 - 不仅仅是WinForms中的图像+文本,而是绝对任何其他WPF控件或一组控件。

与WinForms相比,WPF在编写动态布局方面要容易得多。后者也有布局,但问题在于在可视化设计器中使用它们非常麻烦,通过代码编写WinForms组件初始化非常繁琐。使用WPF,您只需手动编写XAML标记,布局(以及控件树总体)在XML中自然表示。

部分源于上述原因,我发现WPF更容易本地化。首先,这是因为您确实需要动态布局才能进行本地化(因为您不知道所有区域设置中字符串的长度)。 WinForms解决此问题的方法是将控件位置和大小视为“可本地化属性” - 因此,如果翻译人员发现字符串不适合,则应自行重新排列表单上的控件。在WPF中,动态布局是默认方法,因此本地化程序只需处理字符串。

WPF绑定框架相当强大(即使冗长,由于缺少内联转换器),并且大力推广MVP以及一般的模型/视图分离。在2.0+的WinForms中也可以实现这一点,并且我也尝试在那里做到这一点,但这更加繁琐,特别是对于空值处理,并且有时可能会相当有错误

一个特别痛点是WinForms设计器与源代码控制的交互方式。这里有两个类似的问题。首先,设计器将编辑的窗体序列化为代码,并且有时候布局中非常微小的更改就会使设计器生成完全不同的代码(如果您编辑工具栏,则尤其明显),因为它会重新排列代码行——实际上,它只更改了一行上的单个属性值,但也重新排序了所有内容。这导致历史记录中有很多噪音(很难通过差异查看确切的更改),但更重要的是,这意味着合并这样的文件是一个主要的头疼问题。当两个人同时使用同一个窗体进行工作,然后一个人提交他的更改,另一个人试图提交时,发现文件在此期间已更改,试图合并,看到差异,并跳出最近的窗口时,通常会发生这种情况。
当您使用WinForms本地化表单时,会出现非常相似的问题,它会将某些属性推送到资源文件中。同样,设计器非常喜欢为任何琐碎的更改重新排序资源文件中的属性值,并具有前面描述的所有相同问题。
现在谈到WPF的缺陷。一个主要的缺陷是它相当复杂,并且可能对只有WinForms、VCL、VB或其他类似的“传统”框架经验的人来说感觉陌生。另一个问题是文档,在我看来,不是很完美——它通常给出了一个不错的概述,但很少涵盖一些可能非常重要的边角情况。这也适用于WinForms,但那里的可能组合更少,因此边角情况也更少。

还有第三方组件的问题。WinForms已经存在很长一段时间了,有许多可用于它的组件,其中很多非常成熟。WPF相对年轻,仍在经历成长的痛苦,因此大多数第三方解决方案也是如此。

我在WPF中特别讨厌的一个问题是它抗锯齿文本的方式——大多数人认为这种方式在小字体大小时与普通的Windows ClearType相比质量要差得多;请参见此错误报告以获取更多信息。这在WPF 4中得到了修复,但该版本尚未发布,即使发布后,您可能仍然想坚持使用经过验证的3.5 SP1一段时间;而且这个修复程序没有被反向移植。


2
谢谢!这是完美的答案,正是我在寻找的那种信息。我很喜欢你的乐高积木比喻。我一直试图忽略WPF,但这里的评论已经让我相信现在是学习它的时候了。 - DanDan
7
值得一提的是,衡量某项微软技术成熟度的一个好标志是微软自身是否使用该技术。截至本篇写作时,有一个主要的微软产品单独使用WPF——Expression Blend,并且有一个即将推出的重要产品大量使用WPF,并仅将其用于任何新UI,而将WinForms和本地Win32仅保留给少量遗留模块——VS2010。这意味着,任何影响到这些产品的WPF不足之处都会受到极大的关注。我知道因为VS2010的使用,.NET 4中进行了相当多的WPF修复 :) - Pavel Minaev
VS2010是用WPF编写的,从外观上与2008相比可以看出来,但上次我测试它时仍然存在漏洞,并且颜色很丑 :) - David Brunelle
如果您发现任何错误,请在Connect上报告它们(很有可能已经修复-测试版2已经过去了一段时间,显然我们在此期间继续努力)。关于颜色...暂无评论,请稍等片刻~ - Pavel Minaev
非常感谢您抽出时间撰写这篇优秀且富有信息量的文章,阅读过程中让我受益匪浅,学到了不少新知识。+1! - JasCav

11

WinForms并非已经过时或将要淘汰……只是如果没有大量的工作,无法提供与WPF相同的用户体验。 它们只是更老的技术。

WPF是学习的好技术。它可以提供更丰富的用户体验,并且需要较少的工作。

使用WPF的模型肯定不同于WinForms。我两者都用过(WinForms比WPF / Silverlight使用得更多),对我来说最困难的转换是:

  1. XAML,如果您具有使用其他标记语言(如MXML)的经验,则不会太糟糕。

  2. DataBinding

  3. 接口事件处理(MouseOver效果,时间轴等)


从这里的评论中,我现在意识到WPF不仅仅是另一种WinForms,它提供了更多。看起来值得花些时间去学习它! - DanDan

4

WinForms离死亡/衰退还有很长一段距离。 WPF只是一种更新的处理UI的方法,因为它推广了在WinForms中更加困难的事情。像将UI后面的模型与实际UI分离,以便可以轻松测试等都是重要因素。

学习它绝对是值得的,但一定要学习“WPF方式”创建屏幕,而不仅仅是将你的WinForms方式适配到其中。这是一种不同的编码方式。


谢谢提供的信息。你有没有关于学习“WPF方式”的好链接或书籍推荐? - DanDan
1
@DanDan - 我见过的最好的免费在线资源是Dr WPF的网站,网址为http://drwpf.com/blog/。一定要浏览他的ItemsControl A-Z!对我来说最好的书籍,尽管它也是最古老的之一,是由Sams Publishing出版的Adam Nathan的WPF Unleashed。希望有所帮助。 - Berryl

4

2016年的看法:

虽然这个问题已经有些老了,但我认为在这个问题上加上一个结论是很合适的。为什么呢?因为即使到了现在(2016年),我仍然听到在企业环境中工作的开发人员仍在问这个问题。

是的,七年过去了,WinForms仍然在企业环境中存活,并且仍然得到了微软的支持。Google Trends显示自2005年中期以来,对WinForms的关注度缓慢而稳定地下降,目前的兴趣约为2005年的三分之一。

WPF在2009年左右引起了轰动,但从未完全成为新UI开发的事实标准。Google Trends显示,WPF的关注度在2009年至2011年之间达到峰值,然后下降速度比WinForms快。目前的搜索兴趣是2011年的一半,但仍然接近WinForms当前的搜索兴趣的两倍。

那么现在开发人员都在用什么呢?基于Web的UI因移动浏览的兴起而大受欢迎。你可以就如何编写Web UI进行争论(AngularJS + WebAPI? ASP.NET MVC? React? 所有这些都在Google Trends上呈上升趋势)。无论您使用哪种技术,很难否认一次编写(响应性)UI,它能够在几乎所有设备和平台上运行的吸引力。云托管服务通过提供低前期基础设施投资的几乎即时/无限缩放进一步推动了向Web的转变。

因此,今天我强烈建议向Web UI迈进,因为它可能会增加应用程序的寿命-这些应用程序通常需要在企业环境中长时间存在。或者,如果您是微软基础的开发人员从事移动开发,Xamarin值得一试。


1
是的 - 完全同意。如果我现在正在制作一个宠物项目,我会使用WinForms,因为它非常容易。任何更复杂和持久的东西都应该首先考虑基于Web UI。任何需要桌面电脑功率/安全性的东西(这不是大部分程序)现在应该看跨平台,所以像QT这样的东西。我不会费心去用WPF - Web技术更加活跃。 - DanDan

2

WinForms在企业环境中可能会长期存在。对于许多目的而言,它们足够好用。许多项目都基于WinForms,并且许多公司将坚持使用该技术而不是混合使用。

话虽如此,WPF才是未来。它是一种更高效、更有能力的UI技术,值得学习。

WinForms和WPF可以共存于单个应用程序中。这可能是它们被引入公司的最常见方式(除了小型概念验证项目)。


这里的普遍共识似乎是WPF将成为未来,也是.NET开发者的关键工具。感谢您的评论! - DanDan

1

当然不是。

Winforms更容易使用(如果你还不了解WPF的话),而且WPF与Winforms模型有很大的区别。

如果你想要一个简单的GUI(标准表单内容),那就用Winforms。如果你想要一些更奇特的东西,并且有时间,那就选择WPF。

我相信在未来,WPF会成为事实上的标准。但现在,如果我想要快速干净的东西,我仍然坚持使用Winforms。

值得一提的是,许多应用程序已经在使用Winforms - 这意味着维护工作通常会涉及到WinForms,所以不要轻视它。


谢谢 - 这是我的无约束但相当简单的项目,因此这可能是开始走向WPF之路的理想机会。 - DanDan
请注意,如果您坚持正确做事并严格分离模型和视图(例如通过应用MVP),则使用WPF仍然可能更容易实现“标准GUI”。 - Pavel Minaev
无论你选择什么,MVP(或WPF的MVVP变体)对于解耦代码来说都是必不可少的。 - Finglas

1

WinForms并没有死。谷歌搜索“winforms C# jobs”,你会发现有很多相关工作。WPF是热门技术,但它仍然相对较新。在我看来,它还需要两到三年才能成为主流。


但看起来它将成为主流?所以我似乎迟早得学习它 :) - DanDan
2
在桌面/厚客户端领域停留足够长的时间,你肯定会不得不学习WPF。 - Dave Swersky

1

这里有一篇关于WinForms和WPF的好博客文章。总体思路是要明智选择,也就是说没有一个胜过另一个。每个都有不同的功能子集。

然而,在WPF和WinForms之间做出决定是另一回事。当然,WPF是新的热门技术,而WinForms已经老旧了,但它是否是正确的选择呢?显然,“这取决于”具体情况,微软正在继续提供和支持WinForms,因此它不会很快消失。那么,选择WPF而不是WinForms的令人信服的因素是什么?Karl在他的WPF业务应用程序系列中暗示了选择WPF而不是WinForms的原因,但对于某些人来说,这些原因可能是微妙的。

我个人更喜欢WPF,因为我是从Web开发者开始的,发现标记语言XAML更自然。


1

我认为在WPF变得更加主流之前学习它绝对是值得的,不断提高技能并了解新技术的经验和知识总是一种加分项,尤其是如果WPF未来被广泛使用。

此外,虽然编写xaml标记与创建表单非常不同,但与编写html并没有太大的不同,如果你曾从事过Web开发,那么这应该不会是一个难以逾越的难关。

虽然WinForms是一种较老的技术,但这并不意味着它将永远消失。我们公司仍有使用VB6编写的应用程序。我们的开发部门只有一半使用.NET-我们分为三个团队,其中一个团队仍在使用.NET 1.1,另一个团队正在使用.NET 2,而我所在的团队则正在使用.NET 3.5(可以说我们很幸运!)


我现在正在学习WPF。也许我最终会对.NET 3.5技术有所了解...可能就在.NET 4.0发布的前一天! - DanDan
最好先抢占先机!你可以尝试直接从.NET 2跳到4.0,但由于现在已经有了3.5,你最好现在开始学习,而不是等到更多的东西让你头疼 :-) - TabbyCool

1

我们开始在一个新项目中使用WPF,坦白说,很难回到WinForms。有很多我再也无法离开的好东西。

不过,有一个建议。虽然你可以用WPF做更复杂的布局(比如说,一个按钮或者几乎任何东西都可以包含其他东西,比如图片、文本框等等),但是一些其他“基础”功能在WinForm中很难复制。 例如:在WPF工具包出现之前,WPF没有数据网格和日期选择器,所以你必须自己做。此外,它仍然没有MaskTextBox,你必须自己做或从第三方下载。最后一个我遇到的问题是关于Treeview的:叶子和父节点之间的线条不显示。

话虽如此,在大多数方面仍然比WinForm好得多。


我只花了几天时间,但它吸引了我。我不知道为什么我迟迟没有开始。 - DanDan

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