我有一个Datagrid,我想知道datacell的位置,以便用窗口覆盖它。
它只使用一个监视器就可以正常工作,但是使用多个监视器时,窗口会被移位。
代码如下:
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);
}结果:
标题始终相差30 (可能是由标题bar)
==>在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;发布于 2011-05-18 03:19:16
这可能与非标准的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;发布于 2011-05-17 22:00:16
你描述的行为是不正确的,我不能复制它。我用下面的代码创建了一个简单的窗口:
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;
};
}
}最后一行(=两个坐标之间的差)永远不会改变。
发布于 2011-05-17 21:59:11
我不能重现你的经历。窗口工作区的左上角(由PointToScreen返回的点)始终从窗口的左上角水平平移8像素,垂直平移30像素。这是在两个显示器的设置上。
您应该能够从SystemParameters class计算值8和30,但是我必须承认,我不能确切地确定使用什么参数来得出系统上的实际值。
https://stackoverflow.com/questions/6030438
复制相似问题