儿童窗口定位

时间:2012-06-27 13:55:38

标签: c# wpf parent-child

我知道之前已经问过这个问题(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。我怎么能得到这个?刚试过这段代码(虽然我老实说,我不太明白)公交车似乎仍然没有密切关注。什么是在屏幕上获取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 个答案:

答案 0 :(得分:2)

relativePoint是控件 relative Window的位置,而不是屏幕。设置Left({1}}(子窗口)的RightmessageWindow点时,点相对到屏幕,而不是父窗口。

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