Spe*_*ish 7 wpf multiple-monitors
我有一个Datagrid,我想知道datacell的位置,用窗口覆盖它.
只有一台显示器,它可以正常工作,但是有多个显示器,窗口就会移位.
这是代码:
Point point = cell.PointToScreen(new Point(0, 0));
...
Window myWindow = new Window();
myWindow.Top = point.Y;
myWindow.Left = point.X;
Run Code Online (Sandbox Code Playgroud)
有人在多台显示器上有定位经验吗?
编辑:
我做了以下测试:
public MyWindow()
{
...
this.LocationChanged += MyWindow_LocationChanged;
}
void MyWindow_LocationChanged(object sender, EventArgs e)
{
Console.WriteLine(this.Top + " <--> " + this.PointToScreen(new Point(0, 0)).Y);
}
Run Code Online (Sandbox Code Playgroud)
结果:
- 单显示器:0 < - > 30; 20 < - > 50; 100 < - > 130
==>始终相差30(可能由标题栏引起)
- 双显示器:0 < - > 30; 20 - 55; 100 < - > 153
==>在0,0的差异为30.但是我将窗口移离0,0.差异越大,但应保持不变.很奇怪!
EDIT2:
这是我的解决方案,感谢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;
Run Code Online (Sandbox Code Playgroud)
这可能与非标准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;
Run Code Online (Sandbox Code Playgroud)