在wpf窗口中获取元素的绝对位置

我想获得一个元素的绝对位置相对于窗口/根元素,当它被双击。 元素在父元素中的相对位置是我所能想到的,而我正在尝试的是相对于窗口的点。 我已经看到了如何在屏幕上获取元素点的解决scheme,但不是在窗口中。

我认为布兰登所要的不是鼠标相对于根元素的位置,而是一些后代元素的位置。

为此,有TransformToAncestor方法:

Point relativePoint = myVisual.TransformToAncestor(rootVisual) .Transform(new Point(0, 0)); 

myVisual是刚被双击的元素,而rootVisual是Application.Current.MainWindow,或者你想要的位置。

要获得窗口中UI元素的绝对位置,您可以使用:

 Point position = desiredElement.PointToScreen(new Point(0d, 0d)); 

如果您位于用户控件中,并且只需要该控件中UI元素的相对位置,则只需使用:

 Point position = desiredElement.PointToScreen(new Point(0d, 0d)), controlPosition = this.PointToScreen(new Point(0d, 0d)); position.X -= controlPosition.X; position.Y -= controlPosition.Y; 

将此方法添加到静态类:

  public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false) { var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0)); if (relativeToScreen) { return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight); } var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0)); absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y); return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight); } 

relativeToScreen参数设置为true以便从整个屏幕的左上angular进行布局,或者将应用程序窗口左上angular的布局设置为false

嗯。 您必须指定在Mouse.GetPosition(IInputElement relativeTo)单击的窗口以下代码适用于我

 protected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); Point p = e.GetPosition(this); } 

我怀疑你需要引用窗口不是从它自己的类,而是从应用程序的其他angular度。 在这种情况下Application.Current.MainWindow将帮助你。