我有一个 Datagrid,我想知道用一个窗口覆盖它的数据单元的位置。
它只适用于一台显示器,但使用多台显示器时,窗口会移位。
这是代码:
Point point = cell.PointToScreen(new Point(0, 0));
...
Window myWindow = new Window();
myWindow.Top = point.Y;
myWindow.Left = point.X;
有人有在多台显示器上定位的经验吗?
编辑:
我做了以下测试:
public MyWindow()
{
...
this.LocationChanged += MyWindow_LocationChanged;
}
void MyWindow_LocationChanged(object sender, EventArgs e)
{
Console.WriteLine(this.Top + " <--> " + this.PointToScreen(new Point(0, 0)).Y);
}
结果:
- 单显示器:0 <--> 30; 20 <--> 50; 100 <--> 130
==>总是相差30(可能是标题栏造成的)
- 双显示器:0 <--> 30; 20 <--> 55; 100 <--> 153
==> 在 0,0 相差 30。但是我将窗口从 0,0 移开的越多。差异越大,但应该保持不变。很奇怪!
编辑2:
这是我的解决方案,感谢 CodeNaked提示:
Point point = cell.PointToScreen(new Point(0, 0));
...
Window myWindow = new Window();
PresentationSource source = PresentationSource.FromVisual(this);
myWindow.Top = point.Y / source.CompositionTarget.TransformToDevice.M22;
myWindow.Left = point.X / source.CompositionTarget.TransformToDevice.M11;
最佳答案
这可能与非标准 DPI 设置有关,但我很确定该设置会影响所有显示器。 This blog显示如何获得正确的位置。但代码是有效的:
PresentationSource source = PresentationSource.FromVisual(control);
double dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
double dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
window.Left = point.X * 96.0 / dpiX;
window.Top = point.Y * 96.0 / dpiY;
关于wpf - 多台显示器上的错误坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030438/