Ottieni posizione assoluta dell’elemento all’interno della finestra in wpf

Vorrei ottenere la posizione assoluta di un elemento in relazione all’elemento window / root quando viene fatto doppio clic. La posizione relativa dell’elemento all’interno del suo genitore è tutto ciò a cui riesco a capire, e quello che sto cercando di ottenere è il punto relativo alla finestra. Ho visto soluzioni su come ottenere il punto di un elemento sullo schermo, ma non nella finestra.

Penso che ciò che BrandonS vuole non sia la posizione del mouse rispetto all’elemento radice, ma piuttosto la posizione di qualche elemento discendente.

Per questo, c’è il metodo TransformToAncestor :

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

Dove myVisual è l’elemento su cui è stato fatto doppio clic e rootVisual è Application.Current.MainWindow o qualsiasi altra posizione desideri.

Per ottenere la posizione assoluta di un elemento dell’interfaccia utente all’interno della finestra puoi utilizzare:

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

Se si è all’interno di un controllo utente e si desidera semplicemente la posizione relativa dell’elemento dell’interfaccia utente all’interno del controllo, utilizzare semplicemente:

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

Aggiungi questo metodo a una class statica:

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

Imposta il parametro relativScreen su true per il posizionamento dall’angolo in alto a sinistra dell’intero schermo o su false per il posizionamento dall’angolo in alto a sinistra della finestra dell’applicazione.

So che questa domanda è vecchia, ma, poiché .NET 3.0, puoi semplicemente usare *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*) .

Questo ti darà il punto 0, 0 del tuo pulsante, ma verso il contenitore. (Puoi anche dare un altro punto che 0, 0)

Controlla qui per il doc.

Hm. Devi specificare la finestra su cui hai fatto clic su Mouse.GetPosition(IInputElement relativeTo) codice seguente funziona bene per me

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

Ho il sospetto che sia necessario fare riferimento alla finestra non dalla propria class ma da un altro punto dell’applicazione. In questo caso Application.Current.MainWindow ti aiuterà.