web-dev-qa-db-fra.com

Obtenir la position absolue de l'élément dans la fenêtre dans wpf

Je voudrais obtenir la position absolue d'un élément par rapport à l'élément window/root quand il est double-cliqué. La position relative de l'élément dans son parent est tout ce que je peux sembler comprendre, et ce que j'essaie de comprendre, c'est le point relatif à la fenêtre. J'ai vu des solutions pour obtenir le point d'un élément à l'écran, mais pas dans la fenêtre.

78
BrandonS

Je pense que ce que veut BrandonS n’est pas la position de la souris par rapport à l’élément racine, mais plutôt la position de certains éléments descendants.

Pour cela, il existe la méthode TransformToAncestor :

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

myVisual est l'élément sur lequel vous venez de cliquer deux fois et rootVisual est Application.Current.MainWindow ou ce que vous souhaitez pour la position.

114
Robert Macnee

Pour obtenir la position absolue d'un élément d'interface utilisateur dans la fenêtre, vous pouvez utiliser:

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

Si vous êtes dans un contrôle utilisateur et que vous voulez simplement la position relative de l'élément d'interface utilisateur dans ce contrôle, utilisez simplement:

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

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;
37
Filip

Ajoutez cette méthode à une classe statique:

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

Définissez relativeToScreen paramater sur true pour le placer dans le coin supérieur gauche de tout l'écran ou sur false pour le placer dans le coin supérieur gauche de la fenêtre de l'application.

15
Andreas

Je sais que cette question est ancienne, mais depuis .NET 3.0, vous pouvez simplement utiliser *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*).

Cela vous donnera le point 0, 0 de votre bouton, mais vers le conteneur. (Vous pouvez aussi donner un autre point que 0, 0)

Vérifiez ici pour le doc.

3
Guibi