如果您正在做复杂的用户界面,WPF 是要走的路。winforms 不支持任何东西。
如果您正在做简单的用户界面,WPF 是要走的路,因为:
- 它允许更清晰的模式(MVVM),而不是可怕的太多代码——所有程序化的 winforms 方法。
- 它具有更强大的 DataBinding 功能。
- 如果您需要自定义任何内容,您可以.
- 它具有内置的UI 虚拟化。
- 默认情况下它与分辨率无关。
如果您担心长期问题:
WPF是要走的路。当前/未来的 Windows UI 框架是 WinRT XAML。最终将您的 WPF 应用程序移植到 WinRT XAML 比 winforms 应用程序要容易得多。而且,由于 MVVM 确实与技术无关,您最终可以在任何其他 UI 技术中重用您的 ViewModel。
编辑:由于我收到了很多反对票,并且围绕这个答案进行了很多讨论,所以我将特别关注 OP 的问题并尝试提供一个相当客观的答案:
性能:当您将 WPF 的内存使用情况与真正简单的 UI(例如 aWindow
或Form
仅包含 a TextBox
)的 winforms 进行比较时,WPF 似乎比 winforms 消耗更多的内存。这是因为 WPF 框架比 winforms 大得多,因此它有更多的“要加载的东西”才能工作。当您比较冷启动时间时也是如此(同样,在 1-control 情况下)。
相反,当您创建由多个控件/按钮/数据网格/组合框/文本框/等(业务应用程序中真正常见的东西)组成的较重的 UI 时,差异开始缩小,直到它甚至有利于 WPF。这是因为 WPF 的DependencyProperty系统将默认属性值存储在单个内存空间中,而不是基于每个实例。
WPF 从一开始就旨在用于复杂/丰富的 UI,并经过优化以处理有数千个控件的情况,而不是 1 个控件的情况。
从以数据为中心的角度比较 WPF 和 winforms 之间的性能时,另一个非常重要的方面是,如上所述,UI 虚拟化。只需查看此视频,就可以明显看出 WPF 在您需要在ListBox
. winforms 大师告诉我,winforms 似乎也支持这一点,但是由于 winforms 没有正确支持这一点,您需要求助于称为 P/Invoke,而且从他所说的情况来看,如果其他控件除外,我并不明显ListBox 也支持 winforms(例如DataGridView
and TreeView
)。默认情况下,所有 WPFItemsControls
都已经或可以使用一些简单的应用程序范围样式虚拟化。
硬件加速:你可能会想“我不需要这个”,但如果你环顾四周,在更新 UI 时,winforms 会开始可怕地闪烁的情况有数千种,不一定是在复杂的绘图情况下,在调整大小时也会如此。包含许多控件的窗口。有一些方法可以解决这个问题,但话又说回来,您将不得不开始浪费时间来解决您永远不必开始的问题,而不是专注于您的业务逻辑。WPF 永远不会有这个问题,不仅因为它是硬件加速的,还因为它是基于矢量的,而不是基于位图的。
结论:虽然 winforms 在 1-control 情况下可能表现更好,但 WPF 在现实世界的数据中心 UI 的所有级别上都是明显的赢家。
除此之外,正如@Blam 所提到的,选择一种技术不仅需要分析性能方面,还需要分析可扩展性、可定制性、可维护性、易于开发、长期视角等等。
在所有这些方面,WPF 再次成为明显的赢家。一个设计良好的 WPF MVVM 应用程序有一个非常干净、简洁、漂亮的代码库。winforms,无论你对它有多熟练,总是会强迫你在解决方案后面使用脏代码,这仅仅是因为它不支持真正复杂的场景,并且几乎所有可以想到的东西都需要自定义代码。
特别是可定制性,我会说即使您确实not
计划创建一个完全自定义的丰富 UI,选择 WPF 仍然是一个更明智的决定,因为使用 winforms,如果您想显示您的默认情况下不支持的格式的数据。然后,您将不得不开始遭受诸如“所有者绘制”之类的可怕技术的痛苦和浪费时间,而在 WPF 中,您所需要的只是一个简单的DataTemplate
诚然,WPF 是一个复杂的框架,但实际上并不是它的复杂性导致了陡峭的学习曲线,而是所需的心态改变确实是大多数来自其他框架的开发人员所苦苦挣扎的问题。
而且,如上所述,重要的是您针对抽象而不是针对一组特定的类进行编码,以便您的代码最终可以在需要时移植到其他框架。WPF 允许这样做,而 winforms 则不允许。
如果您在 winforms 上编码,您将永远陷入 winforms 的无能和黑客背后的代码。确实,如果您在 winforms 上使用 MVP,这会有所缓解,但 Presenter 与 UI 框架的耦合仍然比 MVVM 中的 ViewModel 更紧密,后者完全与 UI 无关。
如果您在 WPF 中使用 XAML 和 MVVM 进行编码,您最终可以将 WPF XAML 视图替换为其他内容,并保持您的 ViewModel 不受影响,这意味着您实际上不必从头开始重写整个应用程序,因为 ViewModel是应用程序,不是意见。