Nasıl yapılır: Görselde Tıklama Testi Geometrisi

Bu örnekte, bir veya daha fazla nesneden oluşan bir görsel nesne üzerinde isabet testi gerçekleştirme işlemi Geometry gösterir.

Örnek

Aşağıdaki örnek, yöntemini kullanan bir DrawingGroup görsel nesneden nasıl alınarak alınarak ilgili bilgileri GetDrawing gösterir. Ardından, hangi geometriye isabet olduğunu belirlemek için içinde her çizimin işlenmiş DrawingGroup içeriği üzerinde bir isabet testi gerçekleştirilir.

Not

Çoğu durumda, bir noktanın görselin işlenmiş içeriklerinden herhangi birini kesişip kesiştire olmadığını belirlemek HitTest için yöntemini kullanabilirsiniz.

// Determine if a geometry within the visual was hit.
static public void HitTestGeometryInVisual(Visual visual, Point pt)
{
    // Retrieve the group of drawings for the visual.
    DrawingGroup drawingGroup = VisualTreeHelper.GetDrawing(visual);
    EnumDrawingGroup(drawingGroup, pt);
}

// Enumerate the drawings in the DrawingGroup.
static public void EnumDrawingGroup(DrawingGroup drawingGroup, Point pt)
{
    DrawingCollection drawingCollection = drawingGroup.Children;

    // Enumerate the drawings in the DrawingCollection.
    foreach (Drawing drawing in drawingCollection)
    {
        // If the drawing is a DrawingGroup, call the function recursively.
        if (drawing.GetType() == typeof(DrawingGroup))
        {
            EnumDrawingGroup((DrawingGroup)drawing, pt);
        }
        else if (drawing.GetType() == typeof(GeometryDrawing))
        {
            // Determine whether the hit test point falls within the geometry.
            if (((GeometryDrawing)drawing).Geometry.FillContains(pt))
            {
                // Perform action based on hit test on geometry.
            }
        }
    }
}
' Determine if a geometry within the visual was hit.
Public Shared Sub HitTestGeometryInVisual(ByVal visual As Visual, ByVal pt As Point)
    ' Retrieve the group of drawings for the visual.
    Dim drawingGroup As DrawingGroup = VisualTreeHelper.GetDrawing(visual)
    EnumDrawingGroup(drawingGroup, pt)
End Sub

' Enumerate the drawings in the DrawingGroup.
Public Shared Sub EnumDrawingGroup(ByVal drawingGroup As DrawingGroup, ByVal pt As Point)
    Dim drawingCollection As DrawingCollection = drawingGroup.Children

    ' Enumerate the drawings in the DrawingCollection.
    For Each drawing As Drawing In drawingCollection
        ' If the drawing is a DrawingGroup, call the function recursively.
        If drawing.GetType() Is GetType(DrawingGroup) Then
            EnumDrawingGroup(CType(drawing, DrawingGroup), pt)
        ElseIf drawing.GetType() Is GetType(GeometryDrawing) Then
            ' Determine whether the hit test point falls within the geometry.
            If (CType(drawing, GeometryDrawing)).Geometry.FillContains(pt) Then
                ' Perform action based on hit test on geometry.
            End If
        End If

    Next drawing
End Sub

yöntemi, FillContains belirtilen veya kullanarak teste isabet alasanıza aşırı yüklenmiş bir PointGeometry yöntemdir. Bir geometrinin vuruşu, dolgu sınırlarının dışına kadar genişletebilir. Bu durumda, 'a ek olarak çağrısı StrokeContains yapmak da iyi FillContains olabilir.

ToleranceTypeAyrıca,İleri düzlük amacıyla kullanılan bir de s sağlamak için kullanabilirsiniz.

Not

Bu örnek, geometriye uygulanan dönüştürmeleri veya kırpmaları dikkate almaz. Ayrıca, doğrudan ilişkili çizimleri yoksa bu örnek stilli bir denetimle çalışmaz.

Ayrıca bkz.