2008-09-05 4 views

Antwort

34

Von "WPF Unleashed", Seite 383:

Visuelle Treffertests können Sie informieren über alleVisual s, die eine Lage schneiden, [...] Sie müssen mit [...] die [VisualTreeHelper.]HitTest Methode, die einen HitTestResultCallback Delegierten akzeptiert. Vor diese Version von HitTest zurückkehrt, wird der Delegat einmal für jeden relevanten Visual aufgerufen, beginnend mit dem obersten und am Ende ganz unten.

Die Signatur eines solchen Callback ist

HitTestResultBehavior Callback(HitTestResult result) 

und es hat HitTestResultBehaviour.Continue zurückzukehren weitere Treffer zu erhalten, wie unten gezeigt (aus der verknüpften Seite auf MSDN):

// Return the result of the hit test to the callback. 
public HitTestResultBehavior MyHitTestResult(HitTestResult result) 
{ 
    // Add the hit test result to the list that will be processed after the enumeration. 
    hitResultsList.Add(result.VisualHit); 

    // Set the behavior to return visuals at all z-order levels. 
    return HitTestResultBehavior.Continue; 
} 

Für weitere Informationen konsultieren Sie bitte die MSDN documentation for VisualTreeHelper.HitTest.

+5

Siehe den folgenden msdn-Link (Abschnitt: Verwenden eines Treffertest-Ergebnis-Callback) für ein gutes Beispiel. [http://msdn.microsoft.com/en-us/library/ms752097.aspx](http://msdn.microsoft.com/en-us/library/ms752097.aspx] –

+1

Seite 503 in der Ausgabe 2010 von das Buch. FYI. – Sabuncu

+1

Beachten Sie, dass Sie ein visuelles Baumelement erhalten, das die meiste Zeit nicht benötigt wird. Sie müssen rekursiv durch die Eltern der Treffer suchen, um Ihre logischen Ansichtselemente zu erhalten. – henon

3
+0

Die im verknüpften Beispiel verwendete Überladung ([die wahrscheinlich auch direkt in der Antwort repliziert werden sollte] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-) Links-woanders-wirklich-gute-Antworten)) findet nur das oberste Element an der Mausposition, jedoch nicht ein Array von Elementen unter der Maus. –

36

Sie können auch versuchen, die Mouse.DirectlyOver Eigenschaft mit dem obersten Element zu erhalten, die unter der Maus ist.

+0

Dies wird ** nicht ** ein Array von Elementen unter der Maus bereitstellen, aber tatsächlich nur das oberste Element zurückgeben. –