Bagikan melalui


Cara: Tekan Uji Geometri di Visual

Contoh ini menunjukkan cara melakukan pengujian hit pada objek visual yang terdiri dari satu atau beberapa Geometry objek.

Contoh

Contoh berikut menunjukkan cara mengambil DrawingGroup dari objek visual yang menggunakan GetDrawing metode . Tes hit kemudian dilakukan pada konten yang dirender dari setiap gambar di DrawingGroup untuk menentukan geometri mana yang dipukul.

Catatan

Dalam kebanyakan kasus, Anda akan menggunakan HitTest metode untuk menentukan apakah titik berpotangan salah satu konten visual yang dirender.

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

Metode ini FillContains adalah metode kelebihan beban yang memungkinkan Anda untuk mencapai pengujian dengan menggunakan yang ditentukan Point atau Geometry. Jika geometri di-stroke, goresan dapat meluas di luar batas isi. Dalam hal ini, Anda mungkin ingin memanggil StrokeContains selain FillContains.

Anda juga dapat menyediakan ToleranceType yang digunakan untuk tujuan meratakan Bezier.

Catatan

Sampel ini tidak memperhitungkan transformasi atau kliping apa pun yang dapat diterapkan pada geometri. Selain itu, sampel ini tidak akan berfungsi dengan kontrol bergaya, karena tidak memiliki gambar yang terkait langsung dengannya.

Baca juga