Freigeben über


Gewusst wie: Treffertest mit Geometrie als Parameter

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 Overloads Sub OnMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
            ' Retrieve the coordinate of the mouse position.
            Dim pt As Point = e.GetPosition(CType(sender, UIElement))

            ' Expand the hit test area by creating a geometry centered on the hit test point.
            Dim expandedHitTestArea As 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, Nothing, New HitTestResultCallback(AddressOf MyHitTestResultCallback), New GeometryHitTestParameters(expandedHitTestArea))

            ' Perform actions on the hit test results list.
            If hitResultsList.Count > 0 Then
                ProcessHitTestResultsList()
            End If
        End Sub
// 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 Eigenschaftswert 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 Function MyHitTestResultCallback(ByVal result As HitTestResult) As HitTestResultBehavior
            ' Retrieve the results of the hit test.
            Dim intersectionDetail As IntersectionDetail = (CType(result, GeometryHitTestResult)).IntersectionDetail

            Select Case 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

                Case Else
                    Return HitTestResultBehavior.Stop
            End Select
        End Function
// 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;
    }
}
HinweisHinweis

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