【问题标题】:Difference in display of WPF and Windows Forms applicationsWPF 和 Windows 窗体应用程序的显示差异
【发布时间】:2013-09-27 15:13:06
【问题描述】:

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

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

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

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

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

请纠正我并解释一下(这个显示问题)。

【问题讨论】:

  • 我不知道你在说什么。 WPF 与分辨率无关。 winforms 不是。 WPF 不是“模糊的”,如果您有一个看起来模糊的 WPF 应用程序只是 change the font rendering mode
  • WPF 和 winforms 之间的区别在于 WPF 不会像 here 解释的那样烂,也不是完全没用。不,如果您使用 Visual Studio 设计器创建 WPF 应用程序,它不会像 here 解释的那样独立于分辨率。您需要手动键入 XAML 并根据需要使用适当的容器。
  • 在更改屏幕分辨率时,我在 Visual Studio(或任何其他应用程序)中没有发现任何问题。不,您绝不能在 WPF 中对窗口(或元素大小)进行硬编码。诸如按钮之类的东西有时需要固定大小,但是您可以将 LayoutTransform 应用到整个 Window 以补偿不同分辨率下的固定大小。
  • 您也可以将ViewBox 放入您的应用程序中,当屏幕分辨率改变时,它会缩放内容。这样,无论屏幕分辨率是 800 x 600 还是 1920 x 1080,应用程序看起来总是一样的。
  • WPF 是 Windows UI 框架的绝命毒师 - 广受好评,任何使用它的人都对其赞不绝口,但需要一些时间才能进入。不要忘记它比 WinForms 更快的众多原因之一是它是使用 DirectX 管道进行的所有硬件加速!将其与 XAML 的丰富自定义、MVVM 的模块化、数据绑定的简单性相结合,您最终会厌恶使用 self 的旧 Windows 窗体。

标签: wpf winforms


【解决方案1】:

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

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


布局:

WPF layout system 在动态安排元素方面提供了更大的灵活性。它基于 Element Bounding Box(相对于 WinForms 中的 precise pixels)以及 MeasureArrange 机制(相对于 @987654335 @ 在 WinForms 中)自动动态查找每个元素的位置,无需手动更新。

基本上所有元素bounding box都是先测量,然后使用MeasureMeasureCoreArrangeCoreMeasureOverride等多种方法排列。

与 WinForms 不同,在 WinForms 中,您对所有内容都有一个完美的像素大小,在 WPF 中,您有更多的选项和复杂性,例如宽度、ActualWidthDesiredSize(甚至 TransformsLayoutTransform)相同的元素。

这就是为什么

  • 当您输入 WPF 文本框时,其宽度可能会增加并将其他元素推开,甚至将某些元素推入新行(如您观察到的菜单栏)

  • 随着控件大小的变化,它会影响其他元素的可用空间。所以它们的大小和位置可能会相应改变。

  • 当调整窗口大小或更改分辨率时,它会立即更新布局并更改元素的大小以填充或适合空间。 Here you'll find out more about Layouts.

  • 单独使用Margin(不使用布局功能)来排列元素在 WPF 中并不是最好的主意。因为 WinForms 的思维方式在开发 WPF 时并没有太大帮助。


渲染:

WPF 对布局使用 double 数据类型(与像素完美的 WinForms 相对),因此您有时可能会看到边缘模糊,但使用 SnapToDevicePixels=true 可以避免这种情况。

WPF 在利用 GPU 呈现 GUI 方面效率更高。在 Windows 窗体应用程序和 WPF 应用程序中尝试使用 30x30 文本框网格。无论您编写 WPF 多么混乱,它都不会闪烁,并且运行速度仍然比 Windows 窗体快得多。即使在其上添加少量动画、视觉效果和样式也不会像在 Windows 窗体中那样影响您的性能。

备注:为避免 Windows Forms 应用程序速度下降和闪烁,您应该将表单的 DoubleBuffer 设置为“true”。

您可以将任何Transform 用作RenderTransform 来轻松实现平滑缩放/旋转,或开发自定义GPU-based shader effects,等等。 (我想每个人都同意在 WinForms 中做这些事情是可行的,但真正的痛苦,你很可能会放弃并转向 GDI+DX如果不是出于沮丧,那是因为表现不佳。)


最后也是最重要的:

专注于展示:

在开发 WPF 应用程序时,您必须停止思考 Windows 窗体:不再有 UI 事件按名称访问控件在代码隐藏中编写逻辑 并开始思考 WPF:绑定、命令、资源、样式、模板、转换器、DependencyProperties 及其回调

  • WPF 的真正强大之处在于“视图”和“逻辑”的分离,这可以使用MVVM pattern 来实现。

  • 它使视觉上最复杂的问题变得非常简单,易于开发,易于编写单元测试

  • 一旦掌握了窍门,您就会发现呈现数据或炫耀令人敬畏的 GUI 外观的方式没有限制。

如果您计划切换到 WPF,那么您做出了正确的决定。 始终坚持使用 MVVM 并不惜一切代价避免代码隐藏! (即除非您正在执行纯 UI 操作:不要在 .xaml.cs 文件中编写代码,不要在 cs 文件中访问 x:Name 并避免 UI 事件。 )

【讨论】:

    【解决方案2】:

    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 窗体进行维护)。
    • 在应用程序中设计自己的外观和感觉是一项繁重的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2011-01-04
      相关资源
      最近更新 更多