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 来实现,我也尝试在那里实现,但它更乏味,尤其是在 null 处理方面,有时可能是rather buggy。
一个特殊的痛点是 WinForms 设计器与源代码控制交互的方式。这里有两个类似的问题。首先,设计器将编辑后的表单序列化为代码,有时布局中的微小变化会使设计器生成完全不同的代码(如果您编辑工具栏,这一点尤其明显),因为它会打乱代码行 - 即实际上它改变了一行中的单个属性值,但它也重新排序了所有内容。这导致了历史上的大量噪音(在查看差异时几乎不可能说出究竟发生了什么变化),但更重要的是,这意味着合并这些文件是一个令人头疼的问题。这通常发生在两个人同时使用同一个表单,然后一个人提交他的更改,另一个人尝试提交,发现文件同时被更改,尝试合并,查看差异,并跳出最近的窗口。
当您使用 WinForms 可本地化的表单时会发生一个非常相似的问题,它将一些属性推送到资源文件。同样,设计者非常喜欢对资源文件中的属性值进行重新排序,以应对任何微不足道的变化,所有这些问题都与前面描述的相同。
现在关于 WPF 的不足之处。一个主要问题是它相当复杂,并且对于仅具有 WinForms、VCL、VB 或其他类似“传统”框架经验的人来说可能会感到陌生。另一个问题是,在我看来,文档并不完美——它通常提供一个不错的概述,但很少涵盖极端情况,其中一些可能非常重要。 WinForms 也是如此,但那里可能的组合更少,因此也更少极端情况。
还有第三方组件的问题。 WinForms 已经存在很长时间了,有很多可用的,其中很多非常成熟。 WPF 相对年轻,仍在经历成长的阵痛,大多数第三方解决方案也是如此。
我在 WPF 中的一个特别讨厌的地方是它对文本进行抗锯齿的方式 - 大多数人认为与普通 Windows ClearType 相比,它的质量要差得多,尤其是在小字体上;请参阅this bug report 了解更多信息。这在 WPF 4 中已修复,但尚未发布,即使发布,您也可能希望在一段时间内坚持使用久经考验的真正 3.5 SP1;并且该修复不会被反向移植。