WPF像素转换为桌面像素

4

过去我曾被链接到类似问题的回答(这里),该回答讲解了如何将WPF像素坐标转换为桌面坐标,但我不太理解所涉及的数学运算。

Astonish的回答指出,“每个WPF单位的像素数=ConstantWPFUnit大小×显示器DPI”,其中“常量WPF单位大小为1/96”。

在我的情况下,我已经从一个图形对象中获取了DPI,该对象是从我拍摄桌面截图后创建的位图对象生成的(因为我找不到Astonish所提到的属性),因此我有:

Graphics g = Graphics.FromImage(bitmap);
float WpfUnit = (1 / 96) * g.DpiX;

考虑到从图形对象返回的DPI为96,我只能得到

WpfUnit = (1 / 96) * 96 = 1

然而,WpfUnit出现了某些未知的问题导致结果为0(对我来说)。我唯一能想到的解决方法是这样说:

if(WpfUnit == 0) WpfUnit = 1;

即使如此,这并不能真正解决问题,因为在链接答案中建议将高度值和顶部值乘以WpfUnit时,除了被乘以1之外,它们没有任何其他处理。

因此,总的来说,我仍然无法将WPF像素转换为桌面像素。非常感谢您提供任何帮助。

2个回答

6

由于使用1/96进行整数计算,导致WpfUnit为零。请将这些数字明确声明为浮点数。


2

我已经查看了这两种方法,但它们使用的是 System.Windows.Point 而不是我需要创建矩形对象的 System.Drawing.Point :( - Andy Hunt
您可以始终使用适配器模式从一种类型创建包装器以转换为另一种类型。请参阅en.wikipedia.org/wiki/Adapter_pattern。 - huseyint
再次表示感谢!我真的没有想到要手动在这两者之间进行转换 :( - Andy Hunt
当你没有任何窗口时,你不能使用这种方法。如需更灵活的缩放,请参见:http://jerryclin.wordpress.com/2007/11/13/creating-non-rectangular-windows-with-interop/ 代码包括用于缩放的类。 - greenoldman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接