Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym przykładzie pokazano, jak przeprowadzić test trafienia dla obiektu wizualnego, który składa się z jednego lub więcej obiektów typu Geometry.
Przykład
W poniższym przykładzie pokazano, jak pobrać DrawingGroup z obiektu wizualizacji korzystającego z metody GetDrawing. Następnie przeprowadza się test trafienia na renderowanej zawartości każdego rysunku w DrawingGroup w celu określenia, który element geometryczny został trafiony.
Uwaga / Notatka
W większości przypadków należy użyć metody HitTest, aby określić, czy punkt przecina dowolną renderowaną zawartość wizualizacji.
// 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 to przeciążona metoda, która umożliwia trafienie testu przy użyciu określonej Point lub Geometry. Jeśli geometria jest pociągnięta, pociągnięcie może rozciągać się poza granice wypełnienia. W takim przypadku możesz zadzwonić na numer StrokeContains oraz numer FillContains.
Można również podać ToleranceType, który jest używany do celów spłaszczania Beziera.
Uwaga / Notatka
Ta próbka nie uwzględnia żadnych przekształceń ani przycięć, które mogą być stosowane do geometry. Ponadto ta próbka nie będzie działać ze stylizowaną kontrolką, ponieważ nie ma żadnych bezpośrednio powiązanych z nią rysunków.
Zobacz także
.NET Desktop feedback