Udostępnij za pośrednictwem


Instrukcje: testowanie trafień przy użyciu geometrii jako parametru

W tym przykładzie pokazano, jak wykonać test trafienia na obiekcie wizualnym przy użyciu Geometry jako parametru testu trafienia.

Przykład

W poniższym przykładzie pokazano, jak skonfigurować test trafienia przy użyciu GeometryHitTestParameters dla metody HitTest. Wartość Point przekazywana do metody OnMouseDown służy do tworzenia obiektu Geometry w celu rozszerzenia zakresu testu trafienia.

// 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();
    }
}
' 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

Właściwość IntersectionDetail obiektu GeometryHitTestResult dostarcza informacji o wynikach testu trafienia, który używa Geometry jako parametru tego testu. Na poniższej ilustracji przedstawiono relację między geometrią testu trafienia (niebieski okrąg) i renderowaną zawartością obiektu wizualizacji docelowej (czerwony kwadrat).

Diagram przedstawiający wartość IntersectionDetail używaną podczas testowania trafień.

W poniższym przykładzie pokazano, jak zaimplementować wywołanie zwrotne testu trafienia, gdy Geometry jest używany jako parametr testu trafienia. Parametr result jest przekształcany na GeometryHitTestResult, aby uzyskać wartość właściwości IntersectionDetail. Wartość właściwości umożliwia określenie, czy parametr testu trafienia Geometry zawiera się w całości lub częściowo w renderowanej zawartości celu testu trafienia. W takim przypadku przykładowy kod dodaje tylko wyniki testu trafienia do listy wizualizacji, które są w pełni zawarte w granicach docelowych.

// 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;
    }
}
' 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

Notatka

Wywołanie zwrotne HitTestResult nie powinno być wywoływane, gdy szczegóły skrzyżowania są Empty.

Zobacz też