8

其实,我已经开始学习WPF了。我在开发 Windows 窗体应用程序方面有几个月的经验。虽然,我得到了 WPF 应用程序的含义,但我仍然无法根据它们的输出区分两者之间的区别。

参考此链接:Device Independent Pixel (DPI),我了解到,每当操作系统呈现 WPF 应用程序时,它都会根据其分辨率自行管理其大小。

因此,为了检查这种差异,我在两个框架中创建了两个演示应用程序并更改了分辨率。但我没有发现任何令人满意的差异。这可以解释它是一个 WPF 应用程序,而这个是一个 Windows 窗体应用程序。

它不会在最大化时创建任何滚动条,也不会在更改分辨率时使按钮变大或变小。

我在某处读过 Visual Studio 2010 已用 WPF 重写。但是在我的实验中,我看到(在更改桌面分辨率时)它使文本和图形不可读/模糊。在重新调整窗口大小时,除了菜单栏外,一切都被隐藏了。并且菜单栏内容正在改变它的位置,例如最右边的一个菜单项正在向下移动。为什么?

请让我更正并解释更多一点(这个显示问题)。

4

2 回答 2

14

为了正确回答这个问题,我应该写一整章,但我尽量简短:

WPF 应用程序和 Windows 窗体应用程序之间存在三个主要区别:布局、呈现、演示


布局:

WPF 布局系统在动态安排元素方面提供了更大的灵活性。它基于元素边界框(与 WinForms 中的精确像素相反)和测量排列机制(与UpdateLayoutWinForms 中相反),可自动动态查找每个元素的位置,无需手动更新。

基本上,首先测量所有元素边界框,然后使用多种方法排列,例如MeasureMeasureCoreArrangeCoreMeasureOverride等。

与 WinForms 不同,在 WinForms 中,您对所有内容都有一个完美的像素大小,在 WPF 中,您有更多选项和复杂性,例如同一元素的Width、 ActualWidthDesiredSize(甚至转换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 事件。)

于 2013-10-08T21:17:08.393 回答
6

Windows 窗体(WinForms) 和Windows Presentation Foundation (WPF) 是为应用程序构建用户界面的两种不同方式。Windows 窗体是较旧的技术,其控件位于System.Windows.Forms namespace. WPF是一种较新的技术,其控件位于System.Windows.Controls命名空间中。

WPF

优点:

  • 强大的造型和蒙皮结构
  • 轻松创建自己的外观和感觉
  • 是否支持 Windows 窗体
  • 开发 Windows Vista 应用程序的未来技术
  • 重用现有代码的能力
  • 可以进行高度高级的数据绑定

缺点:

  • 声明性与程序性代码
  • 需要 .NET Framework 3.0
  • 与 Windows 窗体相比,仍处于开发阶段
  • 需要与 Dx9 兼容的视频卡才能获得高级图形

Windows 窗体

优点:

  • 可在 Internet 上找到的大量文档
  • 很多例子
  • 是否支持 WPF

缺点:

  • 这将支持多长时间?(我在某处读到微软现在只是在开发 WPF,只对 Windows 窗体进行维护)。
  • 在应用程序中设计自己的外观和感觉需要做很多工作。
于 2014-02-04T14:43:30.453 回答