2

我知道这已经被问过(Get Absolute Position of element within the window in wpf),但我还没有能够正确实现。我正在尝试相对于父窗口中的控件打开一个子窗口。到目前为止,我有这个;

messageWindow = new Message(true);
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0));
messageWindow.Left = relativePoint.X;
messageWindow.Top = relativePoint.Y;
messageWindow.Show();

现在,虽然这确实影响了子窗口 ( messageWindow) 的位置,但它似乎并没有将它放在btn1父控件上/旁边。我遇到的另一个问题是,如果我移动父窗口,然后回想这个方法已经关闭了原始messageWindow窗口的新实例显示在旧位置(即使btn1在新位置)。我觉得这很奇怪,想知道是否有人可以帮我解决这个问题。

更新

感谢 Charleh 解释说我只是相对于窗口中的控制位置设置它们,而不是相对于整个屏幕。所以现在的问题是获取父窗口在屏幕上的位置并将其也添加到 XY 中。我怎么会得到这个?刚刚尝试了这段代码(虽然我会说实话,我不太明白)总线似乎仍然没有密切关注。在屏幕上获取窗口位置的好方法是什么?

messageWindow= new Message(true);
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0));
PresentationSource ScreenPos = PresentationSource.FromVisual(this);

messageWindow.Left = relativePoint.X + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M11);
messageWindow.Top = relativePoint.Y + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M22);
messageWindow.Show();
4

1 回答 1

3

relativePoint是控件对于的位置Window,而不是屏幕。设置(子窗口)的LeftRight点时,点是对于屏幕的,而不是相对于父窗口的。messageWindow

为了获得正确的位置,您需要找到父窗口的位置,然后进行一些数学运算以找到控件相对于屏幕的位置,而不是应该为您提供所需位置的窗口放置子窗口。

于 2012-06-27T14:02:50.723 回答