使用 WPF 要比使用 Windows Forms 更好吗?

21

对于一个全新的应用程序,使用WPF比Windows Forms更好吗?我之前使用过Windows Forms,但不太了解WPF。据我所知,WPF是Windows Forms的继承者,对吧?

该应用程序将托管DirectX窗口(不是WPF 3D,而是Managed DirectXSlimDX),并且还有许多自定义控件。

编辑:该应用程序是一个与3D相关的应用程序,编辑器,类似于 modo

Image created using the 3D painting program modo.


这真的取决于......您能否给我们更多关于您的应用程序的背景信息? - Brann
重复?http://stackoverflow.com/questions/388711/when-is-winforms-the-correct-choice-vs-wpf - DJ.
6
这里的意思是“不是重复的——这个内容有3D/DirectX方面的倾向”。 - Reed Copsey
可能是WPF与Windows Forms的重复问题。 - Peter Mortensen
11个回答

19

大约9个月前,我们曾处理过这个问题。我们决定选择WPF,并且到目前为止我们对这个决定感到满意。是的,有一个学习曲线。这个曲线相当陡峭,特别是从WinForms转换过来,需要遗忘很多内容。我也建议您要有设计师的支持,否则您的应用程序可能看起来有点糟糕。此外,要准备好一些WPF的小坑,这会让你花费数小时来思考“为什么这么难”。

但WPF已经领先一步了。数据绑定、模板化和完全控制窗口外观的能力让你认为这就是WinForms最初应该具备的功能。

哦,对了,要为一些缺失的控件花费一些美元做好准备。例如缺少日期选择器以及在树形控件上添加复选框(实际上可以将其模板化,但在这方面它不如winforms那样简单)。幸运的是,3.5 SP1现在包括一个网格控件。

我肯定还有很多遗漏的地方,但这是我能够脱口而出的内容。

祝你好运!


DatePicker和DataGrid都是WPF Toolkit的一部分,需要.NET 3.5SP1。http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22567 - Andy
更新:WPF现在有许多新控件,请参见http://weblogs.asp.net/scottgu/archive/2009/10/26/wpf-4-vs-2010-and-net-4-0-series.aspx。 - gideon

17

我知道这是一篇旧文章,但我认为这仍然是一个有效的问题。

我在第一家公司工作的三年中使用了WinForms。那里有一些非常优秀的程序员,他们找到了一些非常聪明的方法来做一些非常酷的事情。WinForms经受住了时间的考验。它是一个坚实、可靠和高效的平台。许多人和许多公司,无论大小,都已经使用WinForms多年,这项技术一次又一次地证明了自己。即使你是微软,这种惯性也很难对抗。

不过,WPF肯定是未来。微软通过推出诸如Visual Studio 2010和Expression Blend等产品来表明了这一点。(在内部项目中使用WPF,微软被迫解决了许多问题,例如字体呈现和速度问题,这些问题阻碍了人们最初采用它。Visual Studio 2010表明WPF长期以来一直准备好了生产。

那么,在WinForms或WPF中编写程序哪个更好呢?答案是:WPF。我说这个原因有两个。首先,因为微软在内部支持它,我们可以认为它将存在很长一段时间。微软向我们展示了它是下一个选择的工具,这导致了我的下一个观点:它已经变得优于WinForms(一些我交谈过的人不同意,但这仍然是事实,并且每天变得更加明显)。WPF有许多WinForms永远不会拥有的功能,例如集成支持惊人的数据绑定和基于时间轴的动画,使您可以轻松制作应用程序的惊人主题,并且将让设计师乐意更换。WPF比评论中描述的还要多得多,但对我来说这是两个重要的方面 :)

话虽如此,我知道在WPF中你所不能做的事情在WinForms中也都能够完成。如果你足够努力,你可以用任何语言做任何事情。但是,WinForms会让你在谷歌上搜索如何实现一些酷炫的功能,而WPF则内置了所有微软认为是Windows未来的功能,并将它们直接放在你的指尖。

随着时间的推移,人们会习惯于直接构建到Windows中的新功能,并期望它们在他们使用的所有应用程序中可用。这将达到一个程度,在这个程度上,不支持这些功能的任何东西都会感觉笨拙、不够易用,并且似乎不值得花钱购买。(我认为触摸集成是最明显的例子。尽管有一些触摸屏解决方案可以夹在显示器上并模拟鼠标,在任何计算机上,触摸屏技术已经走了很长的路,随着Windows 8模糊了桌面和移动设备之间的界限,人们很可能希望以一种异常难以实现的方式使用应用程序,如果你的应用程序使用WinForms,则会遇到困难。)

早晚,我相信对WinForms的支持和开发将会停止,那些落后的人将被迫进行移植,并且要快速。然而,有太多的程序依赖于WinForms,以至于微软无法在不久的将来放弃它。谁知道会发生什么。也许对于微软来说,WinForms就像英特尔的Itanium处理器一样,虽然有更好的解决方案可用,但有足够的用户使用它以保持其运行。(http://arstechnica.com/business/news/2011/06/ask-ars-why-itaniumask-ars-with-xeons-improvement-why-bother-with-itanium.ars)
所以我的建议是:对于新开发,请转向WPF。派一些员工参加培训课程,或让他们玩一段时间,这样他们可以更好地了解技术。学习曲线将会很陡峭,但这样做将增加您团队的技能水平,因为通过学习WPF,他们也将很快学会SilverLight,这对于熟悉WPF的人来说足够相似,但是它是为Web而设计的,而不是桌面。这很有价值,因为用WPF重写的应用程序将更容易转换为后续的Web应用程序。WPF是新的,但它是出于某种原因而被制作出来的,而不仅仅是为了让人们学习新东西。它的设计目的是使应用程序更加用户友好、直观和可移植。它的设计目的是帮助开发人员使他们的应用程序适应计算机的新时代。
关于使用WinForms编写的应用程序:我认为可以安全地假设WinForms仍将得到支持相当长的时间,仅仅是因为它获得了大量的支持。我建议让您的团队熟悉WPF,并逐步开始将您的应用程序迁移到WPF。利用微软允许的所有时间,不要急于进程,但始终记住,无论如何,WinForms的日子已经结束了,尽管没有人能确保会发生什么,但是对于这个传统产品的支持将在合理的情况下被取消。即使WinForms应用程序在未来很多年内仍然存在,重要的是要记住,时代正在改变,我们都需要随之改变。

12

----编辑2-----

考虑到你想制作一个类似你展示的那样的编辑器,我更推荐使用WPF。我的当前项目也有许多类似的特性,并且我们已经决定,将WPF与Direct3D内容组合的能力非常强大。能够将场景渲染到任何地方是很好的 - 不仅仅是矩形窗口。在WinForms中,你基本上只能限制在一个矩形内,而且在那里还存在空间问题(例如当菜单拉过hwnd时出现闪烁问题等)。带有D3DImage的WPF合成器消除了所有这些问题,并允许您构建非常灵活的UI。例如,在WPF3D对象的侧面实时渲染您的场景是可能的,或者直接在您的d3d场景顶部使用WPF控件,而不是尝试在D3D中进行GUI等。

-----原始---------

如果您要托管DX,您可能需要考虑它 - 特别是因为如果您使用D3DImage,它使您能够在UI中进行场景组合而没有空间问题。

这可以与SlimDX和WPF一起使用。

----编辑-----

有关使用Winforms进行Direct3D的缺点以及WPF / DX集成的优点的更多信息,请参见:

MSDN关于Airspace的文章

介绍D3DImage的Codeproject文章


6
我发现一旦我掌握了Expression Blend和WPF,我在构建UI方面比使用Windows Forms更有效率。在我看来,这是新技术/工具最重要的因素之一,如果你不能用新工具比旧工具更快地获得相同的结果,那么所有你只使用10%时间的花哨功能都弥补不了它的缺陷。
除此之外,WPF相比Forms还有其他优势: - XAML界面使微调所有那些晦涩属性或将一个控件的整个部分剪切并粘贴到另一个控件中变得容易得多。 - WPF使模块化界面更加容易,逐个控件地拆分屏幕。虽然Forms也可以在一定程度上做到这一点,但我总觉得很费力。 - 一些花哨的功能很酷。我发现动画(storyboards)在数据输入屏幕上非常有用,因为根据选择的产品,你需要不同的输入框。使用Forms,你必须为每个数据输入屏幕创建单独的面板/窗体,而使用WPF,我使用动画来隐藏和移动各种文本框。

5

如果你要编写大量的自定义控件,我建议选择WPF。 WPF的设计部分是可扩展的、组合的,结果就是编写自定义控件非常简单。

我在WinForms中编写过一些自定义控件,有时可能会很具有挑战性。布局真的需要花费很多时间。 我的几个周末都用来做WinForm控件布局了。 在WPF中编写同等的控件却是小菜一碟。


3
我们也曾经历过这种情况......我们开始从WinForms转向WPF。我认为,现在放弃WinForms是一个相当容易的决定。工具越来越好用了,如果你能在团队中找到一位真正的设计师,那么几乎没有什么事情是你做不到的。
我们开始意识到,我们的未来实际上不是WPF,而是Silverlight。随着Silverlight的成熟,它越来越接近WPF,并且允许您进行跨平台运行。Silverlight的路径更像Adobe Air,有一天它将生活在浏览器之外(实际上现在就可以,但很麻烦)。我真的认为,.NET UI的未来将会是Silverlight。

2
在这种情况下,我建议你跟随你的供应商(即Microsoft)的步伐。他们自己的内部生产越来越多地采用WPF;它的范围(考虑Silverlight)和深度明显大于WinForms。他们还越来越多地使用它来参考最佳实践。从所有的证据(这里和其他地方)来看,它似乎已经准备好进行主流开发了。
你对WinForms没有特别的喜好(我猜想是基于熟悉性)。你最终需要进行切换。一个新项目是开始这个过程的好地方,一切都相等的话。

2

我最近刚完成了一个类似的产品(用于在WPF中挖掘数据的3D查看器),我强烈推荐使用WPF/SlimDX。

工具有点松散(特别是Visual Studio),但是使用WPF可以更轻松地制作具有一定亮点的应用程序,而不是大多数东西都默认为灰色控件。

使用3.5SP1中的D3DImage非常容易在控件内部托管SlimDX设备。

总体而言,我认为WPF并不是更好的选择,只是不同。某些方面更好,某些方面则更差。但它绝对是未来。


2

值得一提的是,现在已经是2020年了,我曾经使用过MVVM和Windows Forms编写桌面应用程序。我必须说,我不想再写WPF的样板代码,例如转换器类、使用某种事件中介来在视图之间进行通信、命令等。使用MVVM Light可以解决这个问题。我喜欢WPF/MVVM中代码的清晰分离,但对于小型项目,我认为能够非常快速地推出Windows Forms应用程序的能力是不可低估的。对于图形密集型应用程序,WPF的性能优于Windows Forms。

现在,我倾向于尽可能使用Web开发,因为Web随时随地都可以连接到网络。当然,Web开发通常需要较长的产品交付时间。积极的一点是,你已经掌握的C#知识可以转化为ASP.NET开发。


1
在你的情况下,WPF是有意义的。对我来说,这是一种应用程序选择,因为在Windows Forms中有很多事情可以做得非常好(比如快速开发业务应用程序)。我正在使用WPF为媒体中心应用程序编写漂亮的GUI(个人项目,用于我的50英寸等离子屏幕上的媒体控制台)。
然而,如果我正在编写数据输入和显示应用程序,我通常会选择Windows Forms以提高开发速度。XAML编辑器在Visual Studio 2010中更好,但仍有改进的空间。没有参考,许多属性特性没有智能感知帮助,因此无法知道它们的内容(这就是我花费大量时间寻找这些值的地方,通过书籍或网络示例)。话虽如此,如果您使用WPF编写,您可以创建一些非常引人注目的用户界面。

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