Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird gezeigt, wie Sie einen Treffertest für ein visuelles Objekt ausführen, das aus einem oder Geometry mehreren Objekten besteht.
Beispiel
Das folgende Beispiel zeigt, wie Sie das DrawingGroup aus einem visuellen Objekt abrufen, das die GetDrawing Methode verwendet. Danach wird ein Treffertest am gerenderten Inhalt jeder Zeichnung im DrawingGroup durchgeführt, um zu bestimmen, welche Geometrie getroffen wurde.
Hinweis
In den meisten Fällen verwenden Sie die HitTest Methode, um zu bestimmen, ob ein Punkt einen der gerenderten Inhalte eines visuellen Elements überschneidet.
// 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
Bei der FillContains Methode handelt es sich um eine überladene Methode, mit der Sie den Treffertest mithilfe eines angegebenen Point oder Geometry ausführen können. Wenn eine Geometrie umrandet ist, kann sich die Umrandung über die Füllgrenzen hinaus erstrecken. In diesem Fall möchten Sie möglicherweise StrokeContains zusätzlich zu FillContains anrufen.
Sie können auch ein ToleranceType bereitstellen, das für die Zwecke der Bezier-Glättung verwendet wird.
Hinweis
In diesem Beispiel werden keine Transformationen oder Clippings berücksichtigt, die auf die Geometrie angewendet werden können. Darüber hinaus funktioniert dieses Beispiel nicht mit einem gestylten Steuerelement, da damit keine grafischen Elemente direkt verbunden sind.
Siehe auch
.NET Desktop feedback