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.
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));
Où 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.
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;
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.
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)