gpt4 book ai didi

wpf - 多台显示器上的错误坐标

转载 作者:行者123 更新时间:2023-12-04 12:13:14 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com