首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个监视器上的坐标错误

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

Stack Overflow用户
提问于 2011-05-17 19:59:17
回答 3查看 3.7K关注 0票数 7

我有一个Datagrid,我想知道datacell的位置,以便用窗口覆盖它。

它只使用一个监视器就可以正常工作,但是使用多个监视器时,窗口会被移位。

代码如下:

代码语言:javascript
复制
Point point = cell.PointToScreen(new Point(0, 0));
...
Window myWindow = new Window();
myWindow.Top = point.Y;
myWindow.Left = point.X;

有人有在多个显示器上定位的经验吗?

编辑:

我做了以下测试:

代码语言:javascript
复制
public MyWindow()
{
    ...
    this.LocationChanged += MyWindow_LocationChanged;
}

void MyWindow_LocationChanged(object sender, EventArgs e)
{
    Console.WriteLine(this.Top + " <--> " + this.PointToScreen(new Point(0, 0)).Y);
}

结果:

  • Single-Monitor: 0 <--> 30;20 <--> 50;100 <--> 130

标题始终相差30 (可能是由标题bar)

  • Dual-Monitor: 0 <--> 30;20 <--> 55;100 <--> 153引起的

==>在0,0与30之差。但是我把窗口从0,0移得越远。差异越大,但应该保持不变。非常奇怪!

EDIT2:

以下是我的解决方案,感谢CodeNaked的提示:

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-18 03:19:16

这可能与非标准的DPI设置有关,但我非常确定该设置会影响所有显示器。This blog展示了如何获得正确的位置。但是代码是有效的:

代码语言:javascript
复制
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;
票数 5
EN

Stack Overflow用户

发布于 2011-05-17 22:00:16

你描述的行为是不正确的,我不能复制它。我用下面的代码创建了一个简单的窗口:

代码语言:javascript
复制
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;
            };
    }
}

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-17 21:59:11

我不能重现你的经历。窗口工作区的左上角(由PointToScreen返回的点)始终从窗口的左上角水平平移8像素,垂直平移30像素。这是在两个显示器的设置上。

您应该能够从SystemParameters class计算值8和30,但是我必须承认,我不能确切地确定使用什么参数来得出系统上的实际值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6030438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档