如何使测量DPI独立

时间:2011-09-17 02:33:36

标签: wpf

在回答之前请先阅读我的问题,我知道有关“制作液体布局”等所有建议......

我想在全高清(1920x1080又称1080p)中显示带有背景图像的全屏应用程序,假设屏幕分辨率也是1080p,无论显示器的DPI设置如何都应该。换句话说,背景图像应该以1080p分辨率占据整个屏幕。

另一个复杂因素:此背景图像有几个矩形区域,我想将其他次要图像放入其中。

根元素将是一个Canvas,然后在其上叠加背景图像,然后堆叠辅助内容(照片图像,按钮等......)所有这些都必须与背景正确对齐。

见下图:

----------------------------------------
|   Background image with rectangular area below
|      ___________________________
|     |                           |
|     |                           |
|     | Picture area with         | 
|     | secondary image stacked   |
|     | on top                    |
|     |                           |

问题是:怎么做?

首先请注意以下公式(desiredPixels是您在XAML中编写的内容,realPixels是监视器上显示的内容,DPI是您的监视器DPI)。

realPixels = desiredPixels*DPI/96

意味着:

desiredPixels = realPixels * 96 / DPI

请参阅http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/11/30/wpf-is-dpi-depended.aspx

我提出的想法(但尚未实现)是首先使用实际像素大小设计您的XAML,然后在布局阶段之后,以编程方式向下走逻辑树并调整所有Canvas.Left,Canvas.Top ,宽度和高度测量值乘以96/DPI

你同意吗?有更好的解决方案吗?

编辑:我刚读完我链接的博文。他建议使用自定义标记来完成元素的传递。

Edit2:应用程序必须在具有可能不同DPI设置的不同计算机上运行。因此,它必须动态读取DPI值并相应地调整布局。

1 个答案:

答案 0 :(得分:3)

在评论之后,是的,Viewbox内的所有内容都会按比例缩放,包括画布上元素的位置。

这是Rectangle内蓝色Canvas上的红色ViewboxCanvas.Left上的Canvas.TopRectangle都设置为20个与设备无关的单元。

启动时:

enter image description here

当窗口放大时:

enter image description here

缩小窗口时:

enter image description here

注意:使用Rooler

完成像素测量