2010-02-04 8 views
5

Ich benutze die VisualTreeHelper-Methode FindElementsInHostCoordinates, um ein ListBoxItem an der angegebenen X- und Y-Position zu finden. Der X- und Y-Wert scheint jedoch mit Punkten auf der gesamten Seite und nicht nur mit der ListBox, an der ich interessiert bin, in Beziehung zu stehen (obwohl ich dieses Element in den Teilbaumparameter der Methode übergebe). Dies bezieht sich auf ein benutzerdefiniertes Steuerelement, das von ListBox abgeleitet wird.FindElementsInHostCoordinates relativ zum Kontrollraum nicht ganze Seite

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

So, (0,0) würde an der oberen linken Ecke des gesamten Plug-In nicht der linken oberen Ecke des ListBox relativ sein. Muss ich hier selbst mathematisch arbeiten (im Code), um die Seitenkoordinaten in die ListBox-Koordinaten umzuwandeln, oder gibt es eine andere Möglichkeit, einen Hit-Test durchzuführen, um festzustellen, ob ein X- und Y-Punkt über einem ListBoxItem liegt?

Danke.

Antwort

9

Ich habe das selbst herausgefunden (wow). Ich bestimmen die oberen und linken Werte für meine Kontrolle und fügte dann die X- und Y-Werte intern zu meiner Kontrolle:

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; 

Also, ich in X- und Y-Wert im Verhältnis zu meiner Kontrolle passieren kann, aber dieser Code umwandeln es zu globalen Koordinaten.

Funktioniert für mich und hey !, kein tumbleweed Abzeichen zu dieser Frage. :)

+0

Sie könnten in Betracht ziehen, das schmucklose "silverlight" -Tag in Ihren zukünftigen Fragen zu verwenden, es bekommt mehr Augäpfel. – AnthonyWJones

+0

Danke für den Tipp. Beschreibe in den Details einen anderen an den Teufel. :) – beaudetious