Wpf 多个监视器上的坐标错误

Wpf 多个监视器上的坐标错误,wpf,multiple-monitors,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 MyW

我有一个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);
}

我无法再现你的经历。窗口客户区的左上角(由
PointToScreen
返回的点)始终从窗口左上角水平平移8像素,垂直平移30像素。这是一个双监视器设置


您应该能够从中计算值8和30,但是我必须承认,我不确定要使用哪些参数来获得系统上的实际值。

您描述的行为不正确,我无法重现。 我用以下代码创建了一个简单窗口:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        LocationChanged += (s, e) =>
            {
                var screen = PointToScreen(new Point(0, 0));
                var window = new Point(Left, Top);
                var diff = screen - window;
                textbox.Text = window.ToString() + Environment.NewLine + 
                               screen.ToString() + Environment.NewLine + diff;
            };
    }
}

最后一行(=两个坐标之间的差值)永远不会改变。

这可能与非标准DPI设置有关,但我非常确定该设置会影响所有监视器。显示如何获得正确的位置。但该准则实际上是:

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;

请张贴你得到的价值观和你期望的价值观。我不知道我除了什么。PointToScreen和窗口的点是相同的,因此错误已经存在于PointToScreen-Method中。在问题中添加了一些测试结果。我认为没有问题。移动窗口时,窗口中位置(0,0)处的元素会更改其绝对坐标…不,这两个值都是窗口的左上角,当然在移动时也会更改,但PointToScreen的更改速度要快于此。top(请参见编辑的示例)。这不可能是正确的。与您的示例相同,从0,0开始移动时,差异变得越来越大…我在双屏幕系统上测试了它,并移动了两个监视器上的窗口。。。差异总是恒定的。你的设置有什么特别的吗?我明天会检查。谢谢你到目前为止的帮助。太好了,很有效,谢谢。但在我的例子中,它甚至可以在没有dpi参数(96.0)的情况下工作,请参见我问题中的编辑。
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;