WPF分辨率的独立性

来源:百度文库 编辑:神马文学网 时间:2024/05/01 23:24:09
传统的解决方案总会被某些假设束缚。程序员通常会假定一个标准的监视器(像1024x768象素),按照这种想法设计窗体,并试图保证在更小或者更高尺寸的时候能够合理的恢复到所要求的尺寸大小。

  问题之一就是传统应用程序中的用户界面是不能按比例放大缩小的。结果,如果使用一个高分辨率的监视器,更密的填充象素,应用程序的窗口会变小而且变得有些难以阅读。这在有着高象素密度和相对高分辨率的新显示器中是一个显著的问题。举例来讲,常见的监视器(尤其是膝上型电脑)的象素密度是120dpi或者是144dpi(dots per inch,每英寸点数),而不是传统的96dpi。如果采用它们特有的分辨率(native),显示的内容会紧紧的填满象素,创建地文本或者控件会看起来更小和有些倾斜(eye-squintingly)。

  实际上,显示器会使用更高的象素密度去显示更多的细节。举例来讲,一个高分辨率的显示器能够显示尺寸大小类似的工具条图标,但使用额外的象素去渲染锐度更好的图像。这样做可以在保证基本的布局(layout)的同时提供更好的清晰度和图像细节。由于多方面的原因,这个解决方案在过去是不可能实现的。尽管你可以调整GDI/GDI+的绘制的图像的大小,User32并不支持真正的放大缩小。

  WPF不会有这样的问题是因为它自己渲染用户界面中从基本图形到诸如按钮等常用控件的所有元素。这样的结果就是你在自己的计算机的显示器上创建的一英寸宽的按钮,在一个更高分辨率的显示器上仍然是一英寸宽。这是因为,WPF会在更高的细节用更多的象素来渲染它。

  这是一个大图片,却掩盖了一些细节。最重要的,需要明白的是WPF基于自身的缩放比例是决定于系统DPI设置,不是物理显示设备的DPI。这样做很有意义,毕竟,如果你在一个100英寸的投影仪上展示你的应用程序,你可能是站在几英尺后的地方,期望看到一个视觉上的大尺寸的窗口。你不希望WPF突然把你的应用程序缩放到正常尺寸。简单来说,如果你使用高分辨率的膝上型电脑,有期望的是看到一个些许小一点的窗口,这就是你将所有信息在一个小窗口上展示的代价。此外,不同地用户有不同的性能。有的喜欢展示的细节更丰富,而有的却更倾向于填充更多的内容。

  所以WPF如何决定一个应用程序窗口会有多大呢?简单的来说取决于WPF在计算尺寸的时候的系统DPI设置。要理解它是如何工作的,有助于我们进一步认识WPF的测量系统。 WPF单位

  WPF窗口和所有之内的元素都是使用“独立设备单位”进行测量的。一个独立设备单位被定义为一英寸的96分之一。要理解它在实际应用中的含义,需要考虑一个例子。

  假设你在WPF中创建了一个96×96单位大小的按钮,如果你使用的是标准的Windows DPI设置(96dpi),那么每一个独立设备单位对应一个实际的物理象素。这是因为WPF采用如下的计算方式:

  [物理单位大小]=[独立设备单位大小] × [系统DPI点数]

  =1/96 英寸 * 96 点每英寸

  = 1 象素

  本质上,WPF假定使用96个象素来组成一英寸是通过Windows的系统DPI的设置而获得的。无论如何,实际值取决于你的显示设备。

  举例来讲,一个20英寸的液晶显示器的最大分辨率是1600×1200象素。通过下面的简单计算,就可以计算出这个显示器的象素密度。

  [系统每英寸点数]=Sqrt(1600×1600 +1200×1200) 象素/19 英寸 (Sqrt为开根号)

  =100点每英寸

  这种情况下的象素密度是100dpi,这实际上比Windows假定的值要高一些。结果,这个显示器按96×96象素显示的按钮比一英寸要小一些。

  另一方面,15英寸的液晶显示器的分辨率为1024×768,它的象素密度降到了大约85dpi每英寸,所以96×96的按钮实际上比一英寸要大一些。

  这两种情形中,如果减少屏幕尺寸(选择800×600分辨率),按钮会相应成比例的变大,这是因为系统的DPI设置仍然是96dpi的缘故。换句话说,Windows仍然假定使用96象素大小作为一英寸。即使在分辨率较低,象素数已经远远少了很多的情形下。 系统DPI

  目前为止,WPF的按钮工作原理和应用程序中的其他用户界面元素的工作原理是严格一致的。不同的是在你改变系统DPI设置时的结果。在早期的Windows中,这个特性偶尔被称之为“大字体”。这是因为系统DPI影响了系统字体的大小,但是其他细节却没有甚么改变。

  这恰恰是WPF不同的地方。WPF考虑系统特有的DPI设置,如果将系统DPI改为120dpi,WPF会假定它需要120个象素去填充一英寸的空间。WPF使用如下的计算去得出如何将逻辑单位转换为物理设备的象素。

  [Physical Unit Size]= [独立设备单位尺寸]×[系统DPI]

  =1/96 英寸×120 dpi

  =1.25 象素

  换句话说,当你设置系统DPI为120dpi的时候,WPF渲染引擎假定一独立设备单位等于1.25象素大小。如果显示一个96×96的按钮,物理尺寸实际上是120象素×120象素,这是期待中的结果――一个在标准显示器中显示为一英寸的按钮,在更高象素密度的显示器中仍然显示为一英寸。

  这种自动缩放的功能如果只被应用到按钮中,则实际上是没有多大用处的。但是WPF使用独立设备单位来显示所有的东西,包括形状,控件,文本和放进窗体中的任何元素。结果,系统的DPI可以被更改为任何需要的值,WPF会自动无缝的调整应用程序的尺寸。如何更改DPI取决于所用的系统,具体步骤就不赘述了。 位图与矢量图

  当使用普通的控件时,可以利用WPF的分辨率的独立性。WPF会自动关注所有的控件以保证它们都有正确的尺寸。可是,如果你想将图片合并到你的应用程序,那就不能够漫不经心了。举例来说,在传统的应用程序中,开发人员使用很小的位图到工具条指令。在WPF应用程序中,这种方式却不理想,因为会根据系统的DPI的设置而放大和缩小,位图有可能显示的很模糊。取而代之,在设计WPF应用程序界面时,即使最小的图标也通常设计为矢量图。矢量图被定义为一个图形集,正因为如此,它们可以被缩放到任意尺寸大小。

  很难去高估分辨率独立性的重要性。乍看起来它是一个简单的(straightforward)的一流的(elegant)解决方案,解决了一个历史悠久的问题。然而,为了设计的用户界面能够富有弹性。开发人员需要一种新的思维方法。

  【from http://kb.cnblogs.com/a/1324870/】