win10 wpf窗口定位bug

时间:2015-08-01 22:58:51

标签: c# .net wpf windows windows-10

我在Windows 10中遇到了窗口定位的错误(?)。我在WPF中重现了这一点。让我们说我创建一个这样的窗口:

var d = new Window();
d.Width = 100;
d.Height = 100;
d.Left = 1000;
d.Top = 100;
d.WindowStyle = WindowStyle.None; 
d.ResizeMode = ResizeMode.NoResize;
d.Show();

我正在使用分辨率1920x1080,因此我希望窗口的左侧恰好位于1000px的中心位置(就像在Windows 8中一样),但它并非如此。通过测试(通过悬停鼠标,抓住鼠标坐标,以及通过PointToScreen测试),它显示窗口的X(左)位置实际上是1250而Y(顶部)位置是125.所以全部坐标调整了25%。但是,如果检查Window.Left属性,它仍然会显示1000个实际位于1250的窗口。

我立即去寻找Windows中的显示设置,我发现了这个:

enter image description here

所以我认为,如果这是罪魁祸首,那只是检测这个问题的一个问题,除了我发现即使将此更改为100%而不是125%实际上使无变化和bug仍然是一样的。

所有其他人遇到此错误,如果是窗口显示设置的问题,有没有办法检测它?

1 个答案:

答案 0 :(得分:4)

在Cyral的帮助下,在问题的评论中,找到DPI:

var dpiX = (int)typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null);
var dpiY = (int)typeof(SystemParameters).GetProperty("Dpi", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null);

然后更正:[Desired Pixel Coordinate] * (96 / [dpi])

这是因为WPF使用DPI和虚拟像素进行布局而不是物理像素。