WPF文档和教程指出,WPF是独立于分辨率的,据我所知,它显示了不同分辨率(1600x1200 ->和1024x768)和/或DPI设置下相同大小的窗口。然而,当我尝试一个示例应用程序时。不同的分辨率大小是不同的。在网上,我找到了http://www.wpflearningexperience.com/?p=41,它使用“本地分辨率”,以便在不同的计算机上看到相同的窗口大小,但是我不能理解其基本概念。
为什么LCD的原生分辨率至关重要,分辨率独立是一个术语,而不是DPI独立?也许,我不太了解/使用术语,但我需要澄清一下才能理解这个问题。
发布于 2014-07-25 14:50:59
我不想回答我自己的问题,但我想我明白了。很抱歉这个过早的问题,但过了一段时间我注意到了这个问题。
据我所知,WPF使用系统DPI (通过Windows桌面设置进行更改来设置)作为比例因子。例如,在上面的教程中,其中一台计算机的本机分辨率为1600x1200,DPI为96DPI(实际为94,正如教程中所述)。一切都很好,因为系统DPI (96)非常接近真实的DPI (94),WPF可以使用此信息来缩放窗口。
如你所知,设备独立单元是1/96英寸,并且大于实际像素大小(屏幕上的物理像素)的数字乘以( ( 1 / 96 ) *96)等于1。因此,如果你有一个300DIU的窗口,那么你的屏幕上将看到( 300/96 )英寸。
然而,当你在没有改变系统DPI的情况下改变你的分辨率时,问题来了,这让我困惑不解。比方说,您在不更改系统DPI的情况下将屏幕分辨率设置为1024x768 (仍然是96),然后再次运行应用程序,您会看到一个更大的窗口。这是错误的系统DPI和WPF的自然错误比例因子的结果。WPF不太了解您的实际DPI,它只使用您提供给它的信息,即系统DPI。让我们用这个新的设置重新计算我们的窗口大小。首先,我们需要比例因子( ( 1 / 96 ) *96)等于1。我们可以说,1个逻辑像素也是屏幕上的1个物理像素。但是,我们更改了分辨率,300像素与以前的分辨率不同。以前我们有1600像素的对角线,这也是17英寸的长度。然而,我们现在有1024像素的17英寸。300像素在我们的新分辨率(1024x768)上几乎是5英寸,但在以前的分辨率(1600x1200)下只有3.18英寸。因此,由于错误的DPI值,WPF不能独立于分辨率,并使用新的分辨率绘制更大的窗口。
那么,我该如何解决这个问题(用我的话来说,我并不是说这是一个绝对的解决方案)!当我更改分辨率时,我还更改了DPI值,这对于这个新的分辨率是正确的。例如,对于我自己的显示器,对角线尺寸是17英寸,分辨率为1024x768,我使用公式(1024像素/ 17英寸),发现我的新的真实DPI几乎是60DPI。我将系统DPI设置为60 (当然是通过桌面设置),它可以正常工作。由于计算过程中的舍入误差,这并不完美,但在实践中,可以认为值是相等的。
WPF使用系统DPI以保持分辨率独立,您需要设置实际的DPI (当前分辨率的实际DPI值)。您需要设置DPI,以帮助WPF实现无分辨率。最后(我认为非常重要的是)您还需要做一件事,至少在Windows XP上,您需要重新启动才能使用新值启用DPI设置。如果你不这样做(就像我做的那样),WPF仍然会计算错误,并以不同的大小绘制。
这些是我对测试的理解和结果,但我不能说它们是绝对的。我只想与那些可能觉得这些信息有用的人分享它。如果你发现任何错误或认为需要改进的地方,请评论/编辑我的帖子。
https://stackoverflow.com/questions/24939098
复制相似问题