Freigeben über


Gewusst wie: Treffertest mit Geometrie als Parameter

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie Sie einen Treffertest für ein visuelles Objekt durchführen, indem Sie Geometry als Parameter verwenden.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie mit GeometryHitTestParameters für die HitTest-Methode ein Treffertest eingerichtet wird. Der an die OnMouseDown-Methode übergebene Point-Wert wird zum Erstellen eines Geometry-Objekts verwendet, um den Bereich des Treffertests zu erweitern.

// Respond to the mouse button down event by setting up a hit test results callback.
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // Expand the hit test area by creating a geometry centered on the hit test point.
    EllipseGeometry expandedHitTestArea = new EllipseGeometry(pt, 10.0, 10.0);

    // Clear the contents of the list used for hit test results.
    hitResultsList.Clear();

    // Set up a callback to receive the hit test result enumeration.
    VisualTreeHelper.HitTest(myControl, null,
        new HitTestResultCallback(MyHitTestResultCallback),
        new GeometryHitTestParameters(expandedHitTestArea));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        ProcessHitTestResultsList();
    }
}

Die IntersectionDetail-Eigenschaft von GeometryHitTestResult stellt Informationen über die Ergebnisse eines Treffertests bereit, in dem eine Geometry als Treffertestparameter verwendet wird. In der folgenden Abbildung wird die Beziehung zwischen der Treffertestgeometrie (der blaue Kreis) und dem gerenderten Inhalt des Zielobjekts (das rote Quadrat) dargestellt.

Schnittmenge einer Treffertestgeometrie und eines Zielobjekts

Diagramm von IntersectionDetail bei Treffertests

Das folgende Beispiel zeigt, wie Sie einen Treffertestrückruf implementieren, wenn Geometry als Treffertestparameter verwendet wird. Der result-Parameter wird in ein GeometryHitTestResult umgewandelt, um den Wert der IntersectionDetail-Eigenschaft abzurufen. Mit diesem Eigenschaftenwert können Sie feststellen, ob der Geometry-Treffertestparameter ganz oder teilweise im gerenderten Inhalt des Treffertestziels enthalten ist. In diesem Fall fügt der Beispielcode der Liste visueller Objekte nur Treffertestergebnisse hinzu, die vollständig im Zielbereich enthalten sind.

// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResultCallback(HitTestResult result)
{
    // Retrieve the results of the hit test.
    IntersectionDetail intersectionDetail = ((GeometryHitTestResult)result).IntersectionDetail;

    switch (intersectionDetail)
    {
        case IntersectionDetail.FullyContains:

            // Add the hit test result to the list that will be processed after the enumeration.
            hitResultsList.Add(result.VisualHit);

            return HitTestResultBehavior.Continue;

        case IntersectionDetail.Intersects:

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

        case IntersectionDetail.FullyInside:

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

        default:
            return HitTestResultBehavior.Stop;
    }
}

Tipp

Rufen Sie den HitTestResult-Rückruf nicht auf, wenn die Schnittmenge den Wert Empty aufweist.

Siehe auch

Aufgaben

Gewusst wie: Treffertest für eine Geometrie in einem visuellen Objekt

Konzepte

Treffertests in der visuellen Ebene