Gewusst wie: Treffertest für eine Geometrie in einem visuellen Objekt

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie Sie einen Treffertest für ein visuelles Objekt durchführen, das aus einem oder mehreren Geometry-Objekten besteht.

Beispiel

Das folgende Beispiel zeigt, wie Sie DrawingGroup aus einem visuellen Objekt abrufen, das die GetDrawing-Methode verwendet. Anschließend wird ein Treffertest für den gerenderten Inhalt der einzelnen Zeichnungen in der DrawingGroup durchgeführt, um zu bestimmen, welche Geometrie getroffen wurde.

Tipp

In den meisten Fällen verwenden Sie die HitTest-Methode, um zu bestimmen, ob ein Punkt innerhalb des gerenderten Inhalts eines visuellen Objekts liegt.

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

    }
}

Die FillContains-Methode ist eine überladene Methode, mit der Sie einen Treffertest durchführen können, indem Sie einen angegebenen Point oder eine Geometry verwenden. Wenn eine Geometrie gestrichelt ist, kann die Strichelung ggf. über die Füllbereichsgrenzen hinaus reichen. In diesem Fall sollten Sie zusätzlich zu FillContains auch StrokeContains aufrufen.

Sie können auch einen ToleranceType angeben, der für die Bézier-Abflachung verwendet wird.

Tipp

Bei diesem Beispiel werden keine Clippings oder Transformationen berücksichtigt, die ggf. auf die Geometrie angewendet werden. Außerdem funktioniert dieses Beispiel nicht mit einem formatierten Steuerelement, da diesem keine Zeichnungen direkt zugeordnet sind.

Siehe auch

Aufgaben

Gewusst wie: Treffertest mit Geometrie als Parameter

Konzepte

Treffertests in der visuellen Ebene