Windows Forms是旧技术吗?

Dan*_*Dan 26 wpf winforms

是时候为我的项目编写GUI了,我想知道要使用什么技术.我在.NET 1和2中完成了大部分的.NET GUI开发,因此我对Windows Forms的了解相当不错.我模糊地意识到WPF,但尚未尝试"进入它".

Windows窗体死了还是死了?WPF是一项很好的学习技术吗?它是未来,只是一个阶段,还是一种可以与Windows Forms一起携手合作的技术?

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

Pav*_*aev 45

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来实现,我也尝试在那里实现,但它更繁琐,特别是在空处理方面,有时候可能会有些错误.

一个特别的痛点是WinForms设计者与源代码控制交互的方式.这里有两个类似的问题.首先,设计师将编辑后的表单序列化为代码,有时布局中的微小变化可以使设计人员生成完全不同的代码(如果编辑工具栏,这尤其明显),因为它会改变代码行 - 即实际上它改变了一行上的单个属性值,但它也重新排序了所有内容.这导致了历史上的非常大的噪音(在观察差异时几乎无法确定究竟是什么改变了),但更重要的是,这意味着合并这些文件是一个令人头痛的问题.这时候,两个人在同一时间以相同的形式工作,通常会发生,然后有人犯了他的变化,另一种尝试提交,发现该文件是在此期间改变,试图合并,看到的diff,并跳出最近的窗口.

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

现在至于WPF的不足之处.一个主要的问题是,它有点复杂,对于只有WinForms,VCL,VB或其他类似"传统"框架经验的人来说可能会感到陌生.另一个问题是,在我看来,文档并不完美 - 它通常提供了一个不错的概述,但很少涵盖角落案例,其中一些非常重要.对于WinForms来说也是如此,但是那里可能的组合更少,因此角落情况也更少.

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

我在WPF中的一个特别的痛苦是它反对文本的方式 - 与大多数人的普通Windows ClearType相比,它被认为质量更差,特别是在小字体上; 有关详细信息,请参阅此错误报告.这已在WPF 4中修复,但尚未发布,即使它已经发布,您可能希望在一段时间内坚持使用久经考验的3.5 SP1; 并且修复程序没有向后移植.

  • 作为旁注,给定MS技术成熟的一个好迹象是MS本身是否使用该技术.在撰写本文时,有一个主要的MS产品专门使用WPF - Expression Blend,以及一个即将推出的使用大量WPF的主要产品,并且仅将它用于任何新UI,将WinForms和原生Win32留给一些遗留位 - VS2010.除此之外,它意味着任何对这些产品产生负面影响的WPF缺陷都会受到很多关注.我知道有很多针对.NET 4的WPF修复因为VS2010使用它:) (7认同)
  • 谢谢!这是完美的答案,正是我所寻找的那种信息.我确实喜欢你的lego-brick比喻.我试图忽略WPF,但这里的评论让我确信是时候开始学习了. (2认同)

Jus*_*ner 11

WinForms没有死亡或死亡......他们只是无法提供WPF所能提供的相同用户体验(没有大量的工作).它们只是旧技术.

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

使用WPF的模型肯定与WinForms不同.我使用过两者(WinForms比WPF/Silverlight更重要),对我来说最困难的过渡是:

  1. XAML,如果您有使用其他标记语言(如MXML)的经验,那就不那么糟糕了.

  2. 数据绑定

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