2010-08-12 2 views
14

Je considère cette requête assez simple, mais je n'arrive pas à trouver une réponse concluante dans mes recherches. Comment puis-je déterminer les limites d'un élément visuel particulier dans ma fenêtre, par rapport à un autre élément parent?Déterminer le rectangle de délimitation d'un élément WPF par rapport à un parent

J'ai essayé d'utiliser LayoutInformation.GetLayoutSlot mais cela semble retourner Rect à 0,0 et ne reflète pas l'emplacement réel de l'élément. Ce que j'essaie de faire est de prendre une "capture d'écran" d'une fenêtre en utilisant RenderTargetBitmap puis de la recadrer à un élément particulier, mais je ne peux pas obtenir les limites de l'élément pour savoir à quoi recadrer l'image bitmap!

Répondre

15

Il est assez simple:

public static Rect BoundsRelativeTo(this FrameworkElement element, 
             Visual relativeTo) 
{ 
    return 
    element.TransformToVisual(relativeTo) 
      .TransformBounds(LayoutInformation.GetLayoutSlot(element)); 
} 

En fait, il peut être exagéré de le mettre dans une méthode distincte.

+3

'GetLayoutSlot' récupère l'espace alloué dans la mise en page pour l'élément, mais la taille réelle de l'élément peut être différente s'il a une largeur/hauteur explicite et/ou une transformation. Pour obtenir le rectangle "true", essayez 'element.RenderTransform.TransformBounds (new Rect (element.RenderSize))'. – nmclean

3

de Nevermind, j'ai enfin réussi à comprendre en utilisant une combinaison de LayoutInformation.GetLayoutSlot() (bien que je pourrais probablement avoir utilisé soit ActualWidth/ActualHeight ou RenderSize) et UIElement.TranslatePoint().

Semble une solution assez compliquée quand il pourrait être aussi simple que cela:

myElement.GetBounds(relativeElement); 

Oh bien. Peut-être le temps d'une méthode d'extension. :)

+1

Il n'y a pas de méthode GetBounds dans FrameworkElement. – ygoe

+1

Je disais qu'il devrait y avoir. – devios1

+1

Pourriez-vous montrer la solution complète? Je n'ai pas compris. C'était toujours faux par rapport à un élément parent. Pour l'instant, je convertis tout en coordonnées d'écran avec 'myElement.PointToScreen (new Point())' ce qui est correct pour la gestion de WM_NCHITTEST. Mais je considère toujours que c'est un hack. – ygoe

3

L'option LayoutSlot ne fonctionnait pas du tout pour moi. Cela a fini par me donner une position de l'enfant par rapport à un contrôle parent/ancêtre spécifié:

public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent) 
    { 
     GeneralTransform gt = child.TransformToAncestor(parent); 
     return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight)); 
    } 
+0

Cela a fonctionné pour moi, la réponse acceptée n'a pas. Travailler avec une bordure dans une grille avec WPF dans .NET Framework 4.5.2. – pauldendulk

0

Compte tenu quelques suggestions que je trouve ici ce résolu le problème pour moi.

item.TransformToVisual(relativeToElement) 
    .TransformBounds(new Rect(item.RenderSize)); 
Questions connexes