我正在使用C#在WPF中开发一个地图控件。我正在使用画布控件,例如400×200,其被指定例如地图区域。 2,000米x 1,000米。

地图的比例为: canvas_size_in_meters / real_size_in_meters

我想找到canvas_size_in_meters。

canvas.ActualWidth给出了DIU中的宽度(设备独立单位)。因此,400 DIU为400/96 = 4,17英寸,提供,我的显示器的物理分辨率为96 dpi。

然而,使用标尺,我发现我的显示器的物理分辨率是87 dpi。 (实际上只有少数显示器具有96个物理dpi)

DPI差异(10%)转换为屏幕上实际地图控制宽度的+ 10%差异。

如何以英寸为单位测量WPF控件的大小,无论屏幕分辨率和DPI设置如何?

有帮助吗?

解决方案

  

如何以英寸为单位测量WPF控件的大小,无论屏幕分辨率和DPI设置如何?

这实际上是不可能的,因为要使它工作,WPF必须知道你的监视器的分辨率(就DPI而言)。理论上听起来不错,但在实践中,Windows并不知道这些信息。这就是为什么Windows本身总是盲目地假设96dpi而不是更聪明。

即使有某种方法可以手动告诉它,或者您的特定显示器是否有自定义驱动程序将正确的信息传递给Windows,这对任何其他人的计算机都不起作用,因此Windows无法通过这些信息适用于任何应用程序。

你能做的最好的事情就是像谷歌地图一样绘制比例尺。你知道1 像素 == 1英里,所以你可以在你的地图上绘制一条50像素的线,标签上写着<!> quot;这条线等于50英里<!> <<; p>

其他提示

有办法计算当前像素大小,单位为毫米或英寸。正如之前的帖子中所提到的,它不是固定值,并且会根据当前分辨率和监视器大小而变化。

首先获得当前的分辨率。假设它是1280x1024 现在使用GetDeviceCaps函数获取显示器宽度(mm)。它是一个标准的Windows库函数。

int widthmm = GetDeviceCaps(deviceContext,HORZSIZE); 我的显示器宽度为362mm

因此像素大小= 362/1280 = 0.282 mm

此方法的准确性取决于显示区域完全覆盖显示器宽度的假设。

因此,为了回答原始问题,画布尺寸为400 x 200像素 (400 * 0.282 / 1000)x(200 * 0.282 / 1000)以米为单位显示在显示器上。

感谢您的及时回复。

我完全同意,但我不想首先相信它。你看,如果地图用于显示不同的地图数据层(依赖于比例),则必须有一个近似计算地图的比例。 大多数应用程序使用滑块控件,例如10个离散的地图级别设置<!> quot; scale <!> quot;。

具有绝对比例对于应用程序并不重要,显示指示性比例(例如1:15,000)会更好。

绝对比例需要一个额外的变量 monitorPhysicalDPI (最初设置为96),如果用户选择更改将会给出稍微更好的缩放(同样,这并不重要)。地图控件的大小为:

map.ActualWidth *(96 / monitorPhysicalDPI)* inchesPerDIU, inchesPerDIU是1/96

这些都是化妆品..如果Windows知道ACTUAL控件的尺寸,那会不会很好? (用户必须在操作系统设置中提供有关屏幕尺寸的信息,或者只是安装显示器INF文件)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top