首页 文章

儿童窗口定位

提问于
浏览
1

我知道之前已经问过这个问题(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 回答

  • 2

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

    为了获得正确的位置,你需要找到父窗口的位置,然后做一些数学运算来找到控件相对于屏幕的位置,而不是窗口,它应该为你提供你想要的位置放置子窗口 .

相关问题