【问题标题】:Child window Positioning子窗口定位
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 听起来不错,请问如何获取窗口在屏幕上的位置?
  • this.Topthis.Left 将获取窗口相对于桌面(屏幕)的上/左边缘。
  • 呃!想我今天睡着了......谢谢:D
  • 请记住,TransformToAncestor 点不会考虑窗口的镶边(标题栏),因此您的数学也需要适应这一点。
  • 好点,发现SystemParameters.CaptionHeight 似乎保持铬高度。边框几乎可以忽略不计。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多