Vorgehensweise: Geometrie für den Treffer-Test in einem visuellen Element
In diesem Beispiel wird gezeigt, wie Sie einen Treffertest für ein visuelles Objekt ausführen, das aus einem oder mehreren Geometry Objekten besteht.
Beispiel
Das folgende Beispiel zeigt, wie Sie die DrawingGroup aus einem visuellen Objekt abrufen, das die GetDrawing-Methode verwendet. Anschließend wird ein Treffertest für den gerenderten Inhalt jeder Zeichnung in der DrawingGroup durchgeführt, um zu bestimmen, welche Geometrie getroffen wurde.
Anmerkung
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
Die FillContains-Methode ist eine überladene Methode, die es ermöglicht, mit einem angegebenen Point oder Geometryeinen Test durchzuführen. Wenn eine Geometrie gestrichen ist, kann der Strich über die Füllbereich hinaus ragen. In diesem Fall möchten Sie StrokeContains zusätzlich zu FillContainsaufrufen.
Sie können auch eine ToleranceType zur Verfügung stellen, die für die Zwecke der Bezier-Abflachung verwendet wird.
Anmerkung
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 formatierten Steuerelement, da es keine Zeichnungen direkt zugeordnet hat.
Siehe auch
.NET Desktop feedback