为了正确回答这个问题,我应该写一整章,但我尽量简短:
WPF 应用程序和 Windows 窗体应用程序之间存在三个主要区别:布局、呈现、演示
布局:
WPF 布局系统在动态安排元素方面提供了更大的灵活性。它基于元素边界框(与 WinForms 中的精确像素相反)和测量和排列机制(与UpdateLayout
WinForms 中相反),可自动动态查找每个元素的位置,无需手动更新。
基本上,首先测量所有元素边界框,然后使用多种方法排列,例如Measure、MeasureCore、ArrangeCore、MeasureOverride等。
与 WinForms 不同,在 WinForms 中,您对所有内容都有一个完美的像素大小,在 WPF 中,您有更多选项和复杂性,例如同一元素的Width、 ActualWidth和DesiredSize(甚至转换为LayoutTransform )。
这就是为什么
当您输入 WPF 文本框时,它的宽度可能会增加并将其他元素推开,甚至将某些元素推入新行(如您观察到的菜单栏)
随着控件大小的变化,它会影响其他元素的可用空间。因此它们的大小和位置可能会相应改变。
当窗口被调整大小或分辨率改变时,它会立即更新布局并改变元素的大小以填充或适应空间。 在这里,您将了解有关布局的更多信息。
单独使用Margin
(不使用布局功能)来排列元素不是 WPF 中的最佳主意。因为它是 WinForms 思维方式,在开发 WPF 时没有多大帮助。
使成为:
WPF 使用double
布局的数据类型(与像素完美的 WinForms 相对),因此您有时可能会看到边缘模糊,但可以使用SnapToDevicePixels=true
.
WPF 在利用 GPU 呈现 GUI 方面效率更高。在 Windows 窗体应用程序和 WPF 应用程序中尝试使用 30x30 文本框网格。无论您编写的 WPF 多么混乱,它都不会闪烁,而且它的运行速度仍然比 Windows 窗体快得多。即使在其上添加少量动画、视觉效果和样式,也不会像在 Windows 窗体中那样损害您的性能。
备注:为避免 Windows 窗体应用程序速度下降和闪烁,您应该将窗体的 DoubleBuffer 设置为“true”。
您可以使用任何Transform
作为RenderTransform轻松实现平滑缩放/旋转,或开发基于 GPU 的自定义着色器效果,以及 WPF 中的更多功能。(我认为每个人都同意在 WinForms 中做这些事情是可行的,但确实很痛苦,如果不是因为性能不佳而感到沮丧,你很可能会放弃并转向GDI+或DX 。)
最后也是最重要的:
重点介绍:
在开发 WPF 应用程序时,您必须停止在 Windows 窗体中思考:不再有UI 事件、通过名称访问控件并在代码隐藏中编写逻辑,并开始在 WPF 中思考:绑定、命令、资源、样式、模板、转换器、DependencyProperties和他们的回调。
WPF 的真正强大之处在于“视图”和“逻辑”的分离,这可以使用MVVM 模式来实现。
它使视觉上最复杂的问题变得非常简单,易于开发,并且易于为.
一旦你掌握了窍门,你就会意识到在如何呈现数据或炫耀令人敬畏的 GUI 外观方面没有任何限制。
如果您计划切换到 WPF,那么您做出了正确的决定。始终坚持使用 MVVM并不惜一切代价避免代码隐藏!(即除非您正在执行纯 UI 操作:不要在 .xaml.cs 文件中编写代码,不要在 cs 文件中访问x:Name并避免UI 事件。)