Wpf独立分辨率和原始分辨率

时间:2014-07-24 16:21:52

标签: wpf

WPF文档和教程声明WPF是独立于分辨率的,我理解在不同分辨率(1600x1200 - >原生和1024x768)和/或DPI设置中显示相同大小的窗口。但是,当我尝试一个示例应用程序。不同分辨率的尺寸不同。在网上我找到http://www.wpflearningexperience.com/?p=41,它使用“原生分辨率”以便在不同的计算机上看到相同的窗口大小,但是我无法理解基本概念。

为什么LCD的原生分辨率至关重要,分辨率独立是一个术语而不是DPI独立性?可能,我不太清楚/使用术语,但我需要澄清才能理解这个问题。

1 个答案:

答案 0 :(得分:0)

我不想回答我自己的问题,但我认为我明白了。对不起这个过早的问题,但过了一会儿我注意到了这个问题。

据我所知,WPF使用系统DPI(您通过更改Windows桌面设置来设置)作为比例因子。例如,在上面的教程中,其中一台计算机的原始分辨率为1600x1200和96 DPI(实际上是94,如教程中所述)。一切都很好,因为系统DPI(96)非常接近真正的DPI(94),WPF可以使用这些信息来缩放窗口。

如您所知,设备独立单位为1/96英寸且数字高于实际像素大小(屏幕上的物理像素)乘以((1/96)* 96)等于1.所以如果你有一个300 DIU的窗口,然后你会在屏幕上看到(300/96)英寸。

但是,当您在不更改系统DPI的情况下更改分辨率时,会出现让我困惑的问题。比如说,您将屏幕分辨率设置为1024x768而不更改系统DPI(仍然是96)并再次运行应用程序,您会看到一个更大的窗口。这是错误的系统DPI和WPF自然错误的比例因子的要求。 WPF对您的真实DPI知之甚少,它只使用您提供给它的信息,即System DPI。让我们用这个新设置重新计算窗口大小。首先,我们需要((1/96)* 96)等于1的比例因子。我们可以说1个逻辑像素也是屏幕上的1个物理像素。但是,我们改变了分辨率,300像素与之前的分辨率不一样。以前我们在对角线上有1600像素,长度也是17英寸。但是,我们现在拥有1024英寸的17英寸像素。在我们的新分辨率(1024x768)上,300像素几乎是5英寸,但在之前的分辨率(1600x1200)中只有3.18英寸。因此,由于DPI值错误,WPF无法独立于分辨率,并使用新分辨率绘制更大的窗口。

所以,我如何解决问题(用我的话来说,我并不认为这是一个绝对的解决方案)!当我改变分辨率时,我也改变了DPI值,这对于这个新分辨率是正确的。例如,对于我自己的显示器,对角线尺寸为17英寸,分辨率为1024x768,我使用公式(1024像素/ 17英寸),发现我的新真实DPI几乎是60 DPI。我将系统DPI设置为60(当然通过桌面设置)并且它可以工作。由于计算过程中的舍入误差,并不完美,但实际上可以认为值相等。

WPF使用系统DPI以便独立于分辨率,您需要设置实际DPI(当前分辨率的实际DPI值)。您需要设置DPI以帮助WPF免费解析。最后(我认为非常关键)你还有一件事,至少在Windows XP上,你需要重新启动才能使用新值启用DPI设置。如果你没有(就像我一样),WPF仍会使计算错误并以不同的大小绘制。

这些是我对我所做的测试的理解和结果,但我不能说它们是绝对的。我只是想与可能发现这些信息有用的人分享。如果您发现任何错误或认为需要改进,请评论/编辑我的帖子。