2009-12-16 66 views
25

现在是为我的项目编写GUI的时候了,我想知道使用哪种技术。我在.NET 1 & 2中完成了大部分.NET GUI开发,所以我知道Windows Forms合理。我隐约知道WPF,但还没有试图“进入它”。Windows窗体是否是旧技术?

Windows窗体是死的还是临死? WPF是一个很好的学习技术吗?它是未来,仅仅是一个阶段,还是与Windows Forms并行的技术?

此外,任何经验都会很好听,特别是那些广泛使用的人。你是如何在两个框架中找到类似的功能的?

回答

43

WinForms死了还是临死?

号它不显著进一步发展(即没有新的重大增加),但它在.NET 4中完全支持,例如。

WPF是一种很好的学习技术吗?

是的。

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

它的目的是最终转移到WPF,但也可以理解,在WinForms中有大量现有的代码库,并且在WPF中没有重写它们的商业案例。因此WinForms仍然受支持。

此外,任何经验都会很好听,特别是那些广泛使用的人。你是如何在两个框架中找到类似的功能的?

从广义上讲,WPF更富有表现力。如果您将框架视为可以以各种方式组合在一起的乐高积木,WinForms积木要大得多 - 每个积木都做了很多 - 因此将它们放在一起的方法更少。很多时候,当你需要一些东西 - 但不是很像现有的砖块时,你必须从头开始编写自己的东西。在WPF中,砖块明显更小,并且可以以许多有趣甚至令人惊讶的方式进行组合。

有关具体示例,请考虑WPF Button是如何容纳任意内容的容器 - 不仅仅是WinForms中的图像+文本,还包括任何其他WPF控件或控件组。

与WinForms相比,WPF也更容易编写动态布局。后者也有布局,但问题在于它们是在视觉设计器中使用的皇家PITA,并且通过代码编写WinForms组件初始化非常繁琐。使用WPF,您只需手工编写XAML标记,并且布局(通常是控件树)非常自然地以XML表示。

部分源于上述,我发现WPF更容易本地化。首先,这是因为您确实需要动态布局才能实现本地化(因为您事先并不知道所有语言环境中字符串的长度)。对此,WinForms解决方案不仅考虑文本标签,而且还考虑位置和大小,将其作为“本地化属性” - 因此,如果翻译者发现字符串不适合,则应该自行重新排列窗体上的控件。在WPF中,动态布局是默认方法,所以本地化只是处理字符串。

WPF绑定框架相当强大(即使详细,由于缺乏内联转换器),并大力推动MVP,并在一般情况下,模型/视图分离。这可以通过2.0以上的WinForms来实现,我也试图在那里做到这一点,但它更乏味,特别是在空处理方面,有时可能是rather buggy

一个特别的问题是WinForms设计器与源代码控件的交互方式。这里有两个类似的问题。首先,设计师将编辑后的表格作为代码序列化,并且有时候布局的微小变化可以使设计者生成完全不同的代码(如果编辑工具栏,这种代码会特别明显),因为它会混淆代码行 - 即实际上它改变了单行属性值,但它也重新排序所有内容。这导致了历史上非常多的噪音(几乎不可能分辨出差异时究竟发生了什么变化),但更重要的是,这意味着合并这些文件是一件非常头疼的事情。这通常发生在两个人同时使用同一表单工作时,然后一个人提交他的更改,另一个人尝试提交,发现文件在此期间发生了更改,尝试合并,查看差异,并跳出最近的窗口。

当您使用WinForms可本地化的表单时,会将某些属性推送到资源文件,这时会出现一个非常类似的问题。同样,设计人员非常喜欢在资源文件中对属性值进行重新排序,以便进行任何微小的更改,并具有与前面所述相同的所有问题。

现在就WPF的不足之处。其中最主要的一点是它比较复杂,对于只有WinForms,VCL,VB或其他类似“传统”框架经验的人才会感到陌生。另一个问题是,在我看来,文档并不完美 - 它通常给出一个体面的概述,但很少涉及角落案例,其中一些可能非常重要。对于WinForms也是如此,但是那里可能的组合更少,角落案例也更少。

还有第三方组件的问题。 WinForms现在已经存在了很长一段时间,并且有很多可用的,并且它们中的很多都非常成熟。 WPF相对比较年轻,仍然在经历增长的困境,大多数第三方解决方案也是如此。

WPF中的一个特别的宠物是它反讽文本的方式 - 与大多数人使用普通的Windows ClearType相比,它被认为质量差得多,特别是在小字号的情况下;有关更多信息,请参见this bug report。这已经在WPF 4中得到了解决,但那还没有发布,即使它将会发布,也有可能你会想要坚持一段时间的3.5 SP1,并且修复程序没有被反向移植。

+2

谢谢!这是完美的答案,正是我所寻找的信息。我喜欢你的lego-brick比喻。我试图忽略WPF,但这里的评论让我相信是时候开始学习了。 – DanDan 2009-12-16 18:41:05

+7

作为一个便笺,给定MS技术成熟的一个好兆头是MS本身是否使用该技术。在撰写本文时,有一种主要的MS产品独占使用WPF - Expression Blend,以及一种即将使用大量WPF的主要产品,并且仅将其用于任何新的UI,将WinForms和本机Win32留给少数遗留位 - VS2010。除此之外,这意味着任何对这些产品有负面影响的WPF缺陷都将受到很多关注。我知道有相当多的WPF的.NET 4修复,因为VS2010使用它:) – 2009-12-16 18:54:53

+0

VS2010在WPF中编码,它显示了它与2008年相比的样子,但上次我测试它时,并有难看的颜色:) – 2009-12-18 14:39:55

1

当然不是。

Winforms更易于使用(考虑到您还不知道WPF),而WPF与Winforms模型完全不同。

如果你想要一个简单的GUI(标准形式的东西)去Winforms。如果你想要更华丽一些,并有时间,去WPF。

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

值得一提的是,很多应用程序已经在使用Winforms,这意味着维护工作通常会涉及WinForms,所以请不要直接将它关闭。

+0

谢谢 - 这是我没有束缚但相当简单的项目,所以这可能是开始走向WPF之路的理想机会。 – DanDan 2009-12-16 18:27:07

+0

请注意,如果你坚持正确地做事并严格分离模型和视图(例如通过应用MVP),那么“标准GUI”在WPF中可能仍然更容易实现。 – 2009-12-16 18:35:05

+0

无论你使用什么,MVP(或WPF的MVVP变体)都是解耦代码的必备工具。 – Finglas 2009-12-16 18:43:49

10

WinForms没有死或死...他们只是不能提供WPF可以(没有很多工作)的相同的用户体验。他们只是老技术。

WPF是一个很好的学习技术。它提供了以更少的工作提供更丰富的用户体验的能力。

使用WPF的模型肯定不同于WinForms。我用两个(的WinForms更重比WPF/Silverlight的项目)和对我来说最困难的过渡是:

  1. XAML,如果你有像MXML另一种标记语言经验,这是不是那么糟糕。

  2. 数据绑定

  3. 接口事件处理(鼠标悬停效果,时间表等)

+0

从这里的评论我知道,WPF不只是另一种WinForms,它给出的不仅仅是这些。看起来很值得花点时间! – DanDan 2009-12-16 18:23:06

3

的WinForms还远远没有死/死亡。 WPF只是一种更新的方法来解决UI,因为它促进了WinForms中更加困难的事情。诸如将用户界面背后的模型与实际用户界面分开以便轻松进行测试是一个很重要的因素。

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

+0

感谢您的信息。你有没有学习“WPF方式”的好链接/书籍建议? – DanDan 2009-12-16 18:24:16

+1

@DanDan - 我见过的最好的免费在线资源是WPF博士的网站http://drwpf.com/blog/。通过嗨ItemsControl A-Z!对我来说最好的书,虽然它也是最古老的书之一,但是亚当·纳丹的“三明治”发布了WPF。 HTH – Berryl 2009-12-16 18:30:29

+0

@Berryl - 一个很好的链接,很好找! – DanDan 2009-12-16 18:45:45

1

WinForms并未死亡。谷歌“winforms C#作业”,你会发现很多。 WPF是最热门的东西,但它还是比较新的。对于另外两到三年的恕我直言,这不会是主流。

+0

但它看起来会成为主流?所以我迟早都会去学习它,看起来好像:) – DanDan 2009-12-16 18:25:12

+2

呆在桌面/厚客户端空间足够长的时间,是的,你一定要学习WPF。 – 2009-12-16 18:29:05

2

WinForms可能会在企业环境中存在很长时间。他们在很多方面工作得很好。许多项目都基于WinForms,许多公司将在项目期间坚持使用该技术,而不是混合搭配。

话虽如此,WPF是未来。这是一个更高效,更强大的UI技术,非常值得学习。

WinForms和WPF可以在一个应用程序中共存。这可能是将他们引入公司的最常见方式(即小概念验证项目)。

+0

这里的一般协议似乎是WPF将成为未来,并且是.NET开发人员的关键工具。感谢您的意见! – DanDan 2009-12-16 18:28:22

1

关于WinForms和WPF,下面是一个很好的blog post。总体思路是明智地选择,这意味着没有一个人胜过另一个人。每个都有不同的功能子集。

做出WPF和WinForms之间的决定然而是另一回事。当然,WPF是新的热点,WinForms已经老掉了,但它是正确的选择吗?显然,这取决于这种情况,微软正在继续提供并支持WinForms,因此它不会很快消失。那么选择WPF而不是WinForms有哪些令人信服的因素? Karl在他的WPF业务应用系列中提到了WPF选择WinForms的选择,但其中的原因可能是微妙的。

我个人比较喜欢WPF,因为我是以Web开发人员身份开始的,发现标记XAML更自然。

+0

谢谢,伟大的文章。 – DanDan 2009-12-16 18:20:26

1

我认为在WPF变得更加主流之前,肯定值得学习WPF,提高你的技术水平总是很好,并且对新技术的经验和知识总是有利的,特别是如果WPF将来会被更广泛地使用。另外,尽管编写xaml标记与创建表单有很大的不同,但它不是距离编写html有一百万英里的地方,如果您已经完成了任何web开发,可能不会对您有太大偏离。

尽管WinForms是一种旧技术,但并不意味着它将永远消失,但我们仍然有应用程序在工作中使用VB6编写。我们的开发部门中只有一半人使用.NET工作 - 我们分成3个团队,一个团队仍在使用.NET 1.1,另一个团队使用.NET 2,我所在的团队使用.NET 3.5(可以说我们是幸运的!)

+0

我正在学习WPF的过程。也许我最终会对.NET 3.5技术产生兴趣......可能在.NET 4.0出来之前! – DanDan 2009-12-18 16:35:11

+0

更好的开始!你总是可以尝试从.NET 2直接跳到4.0,但是从现在3.5开始,你现在就可以开始学习了,而不是等到有更多的时间才能开始学习:-) – TabbyCool 2009-12-18 16:39:45

1

我们开始使用WPF做一个新项目,坦率地说,很难回到WinForms。许多整洁的东西,我不能跟你一起了。

虽然一个建议的话。即使你可以用WPF做更复杂的布局(比如它提到的,一个按钮或几乎任何东西,可以托管其他东西,如图像,文本框甚至更多),在WinForm中发现的一些其他“基础”东西很难重现。 示例:在WPF工具包推出之前,WPF没有数据网格和日期时间选择器,因此您必须自己动手。此外,它还没有MaskTextBox,你必须自己做或从第三方下载它。最后一个我遇到了,我实际上发现注解与Treeview:树叶和父母之间的界线不显示。

这就是说,在大多数方面还是比WinForm好得多。

+0

我只花了几个日子在上面,它吸引着我。我不知道是什么花了我很长的时间才去冒险。 – DanDan 2009-12-18 16:36:50

1

我们开始使用WPF在一个新的项目,我们有

新的应用程序包括的WinForms大量的遗留代码。

只要我们想使用winforms的旧对话框,它是可能的。

当你使用WPF时,你并不想回到winforms。在GUI中做这些事情会让你花费大量时间在WinForms上更容易。

任何需要一些时间来学习东西,并能够使用它的所有能力(不仅仅是UI,还有数据绑定和命令模式)的任何方式。

有经验的somone可以帮助第一架构可以是非常有用的。自2016年

+0

我有一本好书和堆栈溢出来帮我:) – DanDan 2009-12-20 13:06:57

+0

没问题。它只是减少进度风险。 祝你好运:) – tal 2009-12-20 13:54:21

2

透视:

我不经常插话主张在这个老问题,而是想到了一个尾声可能是在这一个适当的。为什么?因为即使现在(2016年),我也听到企业环境中的开发人员仍在问这个问题。

是的,七年后,WinForms在企业环境中仍然活着,并且仍然受到Microsoft的支持。 Google Trends自2005年中以来表现出缓慢而稳定的利息下滑,目前的利息约为2005年的三分之一。

WPF在2009年的时候大打出手,但从未完全接管新UI开发的事实标准。谷歌趋势显示WPF利率从2009年到2011年达到峰值,然后下降得比WinForms快。目前的搜索兴趣大约是2011年的一半,但仍然接近WinForms当前搜索兴趣的两倍。

那么开发人员现在使用什么?基于网络的用户界面已经开始流行,主要是由于移动浏览的兴起。你可以争论写出一个Web UI的最佳方式(AngularJS + WebAPI?ASP.NET MVC?React?在Google Trends中所有内容都趋于向上)。无论您使用哪种技术,都很难否认一次编写(响应式)用户界面的吸引力,并使其适用于所有设备和平台。云托管服务通过提供几乎即时/无限的扩展以及低廉的前期基础设施投资,进一步推动了网络的发展。

因此,今天,我衷心推荐使用Web UI,因为它可能会延长您的应用程序的保质期 - 这往往需要在企业环境中持续很长时间。或者,如果你是一位开发移动开发的微软开发人员,Xamarin值得一看。

+1

是的 - 完全同意。如果我现在正在制作一个宠物项目,那么我会使用WinForms,因为它非常简单。作为第一个想法,任何更复杂,更持久的应用都应该基于Web UI。任何需要桌面电源/安全性(这不是一大块程序)的东西现在应该可以看看跨平台,所以像QT这样的东西。我不打扰WPF - 网络技术更加活跃。 – DanDan 2016-06-14 09:55:19