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

标签 wpf multiple-monitors

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

相关文章:

python - 使用主显示器的 Psychopy 脚本

configuration - 如何从脚本控制 KDE 监视器配置?

ubuntu - 新应用程序在 Ubuntu 的错误 x 屏幕中打开

wpf - 从窗口打开其他窗口

C#-我想在我的 wpf 应用程序中添加帮助文件?

WPF 如何始终在 TreeView 上显示扩展器

winapi - HMONITOR 什么时候可以与多个物理显示器关联?

c# - XAML 是否适用于 Visual Studio 中的文件链接?

c# - 在 WPF 中渲染清晰的线条

c# - PointToScreen 多个显示器