我知道这已经被问过(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();