我知道之前已经问过这个问题(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
处于新位置) . 我发现这很奇怪,并想知道是否有人可以帮我解决这个问题 .
UPDATE
感谢Charleh解释说我只是相对于窗口中的控件位置设置它们,而不是整个屏幕 . 所以现在问题是在屏幕上获取父窗口的位置并将其添加到XY . 我怎么能得到这个?刚试过这段代码(虽然我老实说,我不太明白) Bus 车似乎仍然没有密切关注 . 什么是在屏幕上获取Window位置的好方法?
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();
1 回答
relativePoint
是控件相对于Window
的位置,而不是屏幕 . 设置messageWindow
(子窗口)的Left
和Right
点时,这些点相对于屏幕而不是父窗口 .为了获得正确的位置,你需要找到父窗口的位置,然后做一些数学运算来找到控件相对于屏幕的位置,而不是窗口,它应该为你提供你想要的位置放置子窗口 .