实际上,我已经开始学习WPF了。我有几个月的开发Windows窗体应用程序的经验。虽然,我得到了WPF应用程序的含义,但我仍然无法根据它们的输出来区分两者之间的差异。
参考这个Link: Device Independent Pixel (DPI),我了解到,只要操作系统呈现WPF应用程序,它就会根据其分辨率自行管理它的大小。
因此,为了检查这种差异,我在两个框架中创建了两个演示应用程序并改变了分辨率......但我没有发现任何令人满意的差异。这可以解释它是一个WPF应用程序,这个是一个Windows窗体应用程序。
在最大化时不会创建任何滚动条,也不会在更改分辨率时使按钮变大或变小。
我在某处读过Visual Studio 2010已在WPF中重写过。但在我的实验中,我看到了(在更改桌面的分辨率时),它使文本和图形不可读/模糊。在重新调整窗口大小时,除菜单栏外,所有内容都被隐藏起来。并且菜单栏内容正在改变其定位,例如最右边的一个菜单项目正在向下移动。为什么呢?
请让我纠正和纠正再解释一下(这个显示问题)。
答案 0 :(得分:14)
为了正确回答这个问题,我应该写一整章,但我做得很简短:
WPF应用程序与Windows窗体应用程序之间存在三个主要差异:布局,渲染,演示
WPF layout system为动态安排元素提供了更大的灵活性。它基于元素边界框(与WinForms中的precise pixels相对)和测量和排列机制(相对于WinForms中的UpdateLayout
,可以自动动态地找到每个元素的位置,而无需手动更新。
基本上,首先测量所有元素边界框,然后使用多种方法排列,例如Measure,MeasureCore,ArrangeCore,MeasureOverride等。
与WinForms不同,你有一个像素完美的大小,在WPF中你有更多的选项和复杂性,如宽度,ActualWidth和DesiredSize(甚至Transforms as LayoutTransform)表示相同的元素。
这就是为什么
当您键入WPF TextBox时,其宽度可能会增加并推动其他元素,甚至将某些元素推入新行(如您观察到的菜单栏)
随着控件大小的变化,它会影响其他元素的可用空间。因此,它们的大小和位置可能会相应改变。
当重新调整窗口大小或更改分辨率时,它会立即更新布局并更改元素的大小以填充或调整空间。 Here you'll find out more about Layouts.
单独使用Margin
(不使用布局功能)来排列元素并不是WPF中的最佳选择。
WPF使用double
数据类型进行布局(而不是像素完美的WinForms),因此有时您可能会看到边缘模糊,但SnapToDevicePixels=true
可以避免这种情况。
WPF在利用GPU渲染GUI方面效率更高。在Windows窗体应用程序和WPF应用程序中尝试使用30x30 TextBox的网格。无论你编写WPF有多乱,它都不会闪烁,它仍然比Windows Forms运行得快得多。即使在它们上添加一些动画,视觉效果和样式也不会像在Windows窗体中那样损害您的性能。
备注:为避免Windows窗体应用程序中的速度降低和闪烁,应将窗体的DoubleBuffer设置为“true”。
您可以使用任何Transform
作为RenderTransform轻松实现平滑缩放/旋转,或在WPF中开发自定义GPU-based shader effects等等。 (我想每个人都同意在WinForms中做这些事情是可行的,但真正的痛苦,你很可能会放弃并转移到 GDI + 或 DX 如果不是出于挫折,那么因为表现不好。)
最后也是最重要的:
开发WPF应用程序时,您必须停止在Windows窗体中思考:不再需要 UI事件,通过名称访问控件和在代码隐藏中编写逻辑并开始思考WPF:绑定,命令,资源,样式,模板,转换器,DependencyProperties及其回调。
WPF的真正威力在于“观察”和“逻辑”的分离,这可以通过MVVM pattern来实现。
它使视觉上最复杂的问题非常简单易于开发,并且易于编写单元测试。
一旦掌握了它,您就会意识到呈现数据或展示令人敬畏的GUI外观的方式没有限制。< / p>
如果您计划切换到WPF,那么您已做出了正确的决定。 始终坚持MVVM ,你会没事的!即避免代码隐藏(在.xaml.cs文件中编码), XAML名称(除非仅在XAML中使用)和 UI事件可能的。
答案 1 :(得分:6)
Windows窗体(WinForms)和 Windows Presentation Foundation (WPF)是为应用程序构建用户界面的两种不同方法。 Windows窗体是较旧的技术,其控件位于System.Windows.Forms namespace
。 WPF 是一种较新的技术,其控件位于System.Windows.Controls
命名空间中。
<强> WPF 强>
优点:
缺点:
Windows窗体
优点:
缺点: