子窗口定位



我知道之前有人问过这个问题(在 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();

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

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

最新更新