Sdílet prostřednictvím


Postupy: Spuštění geometrie testu ve vizuálním objektu

Tento příklad ukazuje, jak provést test hitu u objektu vizuálu, který se skládá z jednoho nebo více Geometry objektů.

Příklad

Následující příklad ukazuje, jak načíst DrawingGroup z objektu vizuálu, který používá metodu GetDrawing . Test hitu se pak provede s vykresleným obsahem každého výkresu ve výkresu DrawingGroup , aby bylo možné určit, která geometrie byla nalezena.

Poznámka:

Ve většině případů byste metodu HitTest použili k určení, jestli bod protíná jakýkoli vykreslený obsah vizuálu.

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

Metoda FillContains je přetížená metoda, která umožňuje provést test pomocí zadaného Point nebo Geometry. Pokud je geometrie tahována, může tah rozšířit mimo hranice výplně. V takovém případě můžete chtít volat StrokeContains kromě FillContains.

Můžete také poskytnout ToleranceType , který se používá pro účely bezierového zploštění.

Poznámka:

Tato ukázka nebere v úvahu žádné transformace ani výřezy, které mohou být použity na geometrii. Tato ukázka navíc nebude fungovat se stylem ovládacího prvku, protože k němu nejsou přímo přidružené žádné výkresy.

Viz také