Aracılığıyla paylaş


Nasıl yapılır: Geometriyi Parametre Olarak Kullanarak İsabet Testi

Bu örnekte, isabet testi parametresi olarak bir Geometry kullanarak görsel nesne üzerinde isabet testi gerçekleştirme işlemi gösterilmektedir.

Örnek

Aşağıdaki örnekte, GeometryHitTestParameters yöntemi için HitTest kullanarak isabet testinin nasıl ayarlanacağı gösterilmektedir. Point yöntemine geçirilen OnMouseDown değeri, isabet testi aralığını genişletmek üzere bir Geometry nesnesi oluşturmak için kullanılır.

// 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

IntersectionDetail GeometryHitTestResult özelliği, bir Geometry'yi isabet testi parametresi olarak kullanan bir isabet testinin sonuçları hakkında bilgi sağlar. Aşağıdaki çizimde isabet testi geometrisi (mavi daire) ile hedef görsel nesnesinin (kırmızı kare) işlenmiş içeriği arasındaki ilişki gösterilmektedir.

IntersectionDetail'ın vuruş testinde kullanımını gösteren diyagramı.

Aşağıdaki örnek, isabet testi parametresi olarak bir Geometry kullanıldığında isabet testi geri çağırmanın nasıl uygulanduğunu gösterir. result parametresi, GeometryHitTestResult özelliğinin değerini almak için bir IntersectionDetail'e dönüştürülür. özellik değeri, Geometry isabet testi parametresinin isabet testi hedefinin işlenmiş içeriğinde tamamen mi yoksa kısmen mi yer aldığına karar vermenizi sağlar. Bu durumda örnek kod, hedef sınırın içinde tamamen yer alan görseller için yalnızca isabet testi sonuçlarını listeye ekler.

// 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

Uyarı

Kesişim ayrıntısı HitTestResultolduğunda Empty geri çağırması yapılmamalıdır.

Ayrıca bakınız