Obtiene la posición absoluta del elemento dentro de la ventana en wpf

Me gustaría obtener la posición absoluta de un elemento en relación con el elemento ventana / raíz cuando se hace doble clic. La posición relativa del elemento dentro de su padre es todo lo que puedo llegar a parecer, y lo que estoy tratando de llegar es el punto relativo a la ventana. He visto soluciones de cómo obtener el punto de un elemento en la pantalla, pero no en la ventana.

Creo que lo que BrandonS quiere no es la posición del mouse en relación con el elemento raíz, sino la posición de algún elemento descendiente.

Para eso, está el método TransformToAncestor :

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

Donde myVisual es el elemento que acaba de hacer doble clic, y rootVisual es Application.Current.MainWindow o lo que sea que desee con respecto a la posición.

Para obtener la posición absoluta de un elemento de UI dentro de la ventana, puede usar:

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

Si se encuentra dentro de un Control de usuario, y simplemente quiere la posición relativa del elemento UI dentro de ese control, simplemente use:

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

Agregue este método a una clase estática:

  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); } 

Establezca relativeToScreen patwigter en true para ubicarlo desde la esquina superior izquierda de toda la pantalla o en false para colocarlo en la esquina superior izquierda de la ventana de la aplicación.

Sé que esta pregunta es antigua, pero, desde .NET 3.0, puede simplemente usar *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*) .

Esto le dará el punto 0, 0 de su botón, pero hacia el contenedor. (También puedes dar otro punto que 0, 0)

Marque aquí para ver el documento.

Hm. Mouse.GetPosition(IInputElement relativeTo) especificar la ventana en la que hizo clic en Mouse.GetPosition(IInputElement relativeTo) siguiente código funciona bien para mí

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

Sospecho que debe consultar la ventana no desde su propia clase, sino desde otro punto de la aplicación. En este caso Application.Current.MainWindow te ayudará.