2010-02-04 15 views
5

J'utilise la méthode VisualTreeHelper FindElementsInHostCoordinates pour trouver un ListBoxItem à l'emplacement X et Y donné. Cependant, les valeurs X et Y semblent être liées à des points de la page entière et pas seulement au ListBox qui m'intéresse (même si je passe cet élément dans le paramètre subtree de la méthode). Ci-dessous, cela fait référence à un contrôle personnalisé qui dérive de ListBox.FindElementsInHostCoordinates Relatif à l'espace de contrôle pas entier Page

foreach (UIElement element in VisualTreeHelper.FindElementsInHostCoordinates(new Point(X, Y), this)) 
{ 
    if (element is ListBoxItem) 
    { 
     int index = this.ItemContainerGenerator.IndexFromContainer(element); 
     break; 
    } 
} 

Ainsi, (0,0) serait par rapport au coin supérieur gauche du plug-in entier ne le coin supérieur gauche de la zone de liste. Ai-je besoin de faire un peu de travail mathématique ici (en code) pour transformer les coordonnées de la page en coordonnées ListBox ou y a-t-il un autre moyen de tester si un point X et Y donné dépasse un ListBoxItem?

Merci.

Répondre

9

Je me suis dit (wow). Je déterminé les valeurs haut et à gauche pour mon contrôle, puis ajouté le X et Y valeurs internes à mon contrôle:

GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual as UIElement); 
Point offset = gt.Transform(new Point(0, 0)); 
double controlTop = offset.Y + Y; 
double controlLeft = offset.X + X; 

Alors, je peux passer en valeurs X et Y par rapport à mon contrôle, mais ce code transformerai aux coordonnées mondiales.

Fonctionne pour moi et bon !, pas d'insigne tumbleweed sur cette question. :)

+0

Vous pourriez envisager d'utiliser la balise "silverlight" sans fioritures dans vos futures questions, cela attire plus de regards. – AnthonyWJones

+0

Merci pour le conseil. Craie un autre sur le diable dans les détails. :) – beaudetious