有人知道Silverlight/WFP使用哪些测量单位吗?例如,如果我创建一个新按钮并将其高度设置为150,那么这是150像素吗?点数?毫米?
在编码之前,我都是在Adobe Illustrator中设计我的应用程序,尽管我尝试将所有尺寸设置为Illustrator文件中的尺寸,但Silverlight应用程序通常会更大。
有人知道Silverlight/WFP使用哪些测量单位吗?例如,如果我创建一个新按钮并将其高度设置为150,那么这是150像素吗?点数?毫米?
在编码之前,我都是在Adobe Illustrator中设计我的应用程序,尽管我尝试将所有尺寸设置为Illustrator文件中的尺寸,但Silverlight应用程序通常会更大。
虽然从理论上讲,WPF中的1个单位是1/96英寸,但在实践中经常不是这样。
在打印时通常是正确的。但在屏幕上很少是正确的。原因是Windows几乎总能知道打印机的真实分辨率,但几乎永远无法知道屏幕的真实分辨率。
例如,我将三个屏幕连接到我的计算机上。 Windows认为它们都有96像素每英寸的分辨率。实际上并不是这样。其中两个的分辨率为101像素每英寸,另一个的分辨率为94像素每英寸。(为什么?因为Windows没有办法自行计算出真实分辨率,而我也没有告诉它。认为它们都具有相同像素尺寸的虚构接近事实,而且实际上是一个方便的虚构。)
因此,当我在WPF中创建一个宽度和高度均为96的矩形时,矩形的大小实际上取决于其出现的屏幕。Windows认为所有3个屏幕的分辨率均为96像素每英寸,因此它将呈现矩形的大小为96像素高和宽,无论它出现在哪个屏幕上。这将使其在两个屏幕上显示为0.95英寸高,在第三个屏幕上显示为1.02英寸高。
因此,在实践中,这意味着在我的计算机上,WPF中的单位实际上是1/100英寸或1/94英寸。 (也就是说,在实践中,WPF中1个单位的大小正好等于我特定设置中1个像素的大小,无论像素的大小如何。)
我可以更改这个。我可以重新配置Windows - 我可以告诉它所有3个屏幕的实际分辨率,这样名义和实际的WPF单位尺寸就会重合。或者我可以撒谎-我可以声称我的屏幕有每英寸200个像素,这样一切都会很大...
这里的基本问题在于计算机没有标准的方法来发现屏幕上物理像素的真实大小,很少有人费心手动设置它。 (实际上,如果你正确配置它,可能会导致一些软件行为不正确。) 因此,大多数Windows计算机不能正确地向WPF报告物理像素大小 - 这是因为它们不知道。 因此,这个问题没有可靠的答案 - 在屏幕上,1个WPF单位可以是任何东西。(实际上,在大多数情况下,它往往是1个像素,因为如果您不告诉Windows其他信息,它默认假定您的屏幕的像素高度为1/96英寸,这与1 WPF单位相同。对于大多数桌面屏幕而言,这实际上很可能是一个好猜测。但这并非普遍适用的。例如,在配置了所谓的“大字体”的系统上,您将找到不同的名义屏幕分辨率,1个WPF单位将对应略大于1个物理像素 - 实际上约为1.2像素。) 对于打印机,一切都更可预测。打印机通常能够正确报告它们的分辨率。因此,如果您打印96个WPF单位高的东西,您可以相信它将高1英寸。MSDN的文档说明FrameworkElement.Height
属性(适用于Silverlight)是指:
对象的高度(以像素为单位)
然而,对于WPF,它指的是:
设备无关单位(1/96英寸)的测量值
因此,回答你的问题... 对于Silverlight使用像素,对于WPF使用设备无关单位。
文档中提到的是像素,但这些像素是每英寸96个像素。在120 DPI显示器上显示宽度为96的线条将会是实际设备像素数为120。同样,在具有600 DPI打印输出的打印机上绘制的线条将长达600个像素。