【发布时间】:2012-06-27 13:55:37
【问题描述】:
我知道以前有人问过这个问题 (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();
【问题讨论】:
-
你是否考虑到父窗口的坐标?这只会为您提供子窗口的相对位置 - 而不是绝对位置,听起来您需要将子窗口放置在与父窗口相同的位置,然后使用 relativePoint 对其进行转换
-
@Charleh 哦,是的。这是有道理的,为什么它没有与父母一起移动。谢谢!
标签: c# wpf parent-child