C#WPF解决方案独立性?

我正在使用C#在WPF中开发一个地图控件。 我正在使用canvas控件,例如400 x 200,其指定的地图区域为例如2,000mx 1,000m。

地图的比例为: 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像素的线条,标签上写着“这条线等于50英里”

有办法计算当前像素大小,单位为毫米或英寸。 如前面的post中所述,它不是固定值,并且会根据当前分辨率和监视器大小而有所不同。

首先得到当前的分辨率。 假设它是1280×1024现在使用GetDeviceCaps函数得到监视器宽度(mm)。 它是一个标准的Windows库函数。

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

因此像素大小= 362/1280 = 0.282毫米

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

因此,为了回答原始问题,在我的显示器上显示时,400 x 200像素的canvas尺寸将为(400 * 0.282 / 1000)x(200 * 0.282 / 1000)米。

谢谢你的及时回复。

我完全同意,但我不想首先相信它。 你可以看到,如果地图用于显示不同的地图数据层(依赖于比例),则必须对地图的比例进行近似计算。 大多数应用程序使用滑块控件,例如10个离散的地图级别来设置“比例”。

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

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

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

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