2010-02-04 14 views
5

Używam metody VisualTreeHelper FindElementsInHostCoordinates, aby znaleźć obiekt ListBoxItem w podanej lokalizacji X i Y. Jednak wartości X i Y wydają się być związane z punktami na całej stronie, nie tylko z ListBoxem, który mnie interesuje (nawet jeśli przechodzę w tym elemencie do parametru podtree metody). Poniżej odnosi się do niestandardowego sterowania, które pochodzi z ListBox.FindElementsInHostCoordinates Względem kontrolowania przestrzeni nie całą Page

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

Tak, (0,0) byłaby w stosunku do lewego górnego rogu całego wtyczka nie lewym górnym rogu pola listy. Czy muszę wykonać tutaj trochę pracy matematycznej (w kodzie), aby przekształcić współrzędne strony na współrzędne ListBox, czy istnieje jakiś inny sposób wykonania testu trafień, aby stwierdzić, czy dany punkt X i Y znajduje się nad ListBoxItem?

Dzięki.

Odpowiedz

9

Sam to wymyśliłem (wow). Postanowiłem górną i lewą wartości moją kontrolą, a następnie dodaje X i Y ceni wewnętrznego moją kontrolą:

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; 

Tak, mogę przekazać w wartości X i Y w stosunku do mojej kontroli, ale ten kod przekształci do globalnych współrzędnych.

Działa dla mnie i hej !, nie ma odznaki kłody na to pytanie. :)

+0

Możesz rozważyć użycie nieoznakowanego tagu "silverlight" w swoich przyszłych pytaniach, dostaje więcej gałek ocznych. – AnthonyWJones

+0

Dzięki za cynk. Podsuń kolejne szczegóły diabłu. :) – beaudetious