Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este ejemplo se muestra cómo realizar una prueba de posicionamiento en un objeto visual compuesto por uno o varios Geometry objetos.
Ejemplo
En el siguiente ejemplo se muestra cómo recuperar el DrawingGroup de un objeto visual que utiliza el método GetDrawing. A continuación, se realiza una prueba de impacto en el contenido representado de cada dibujo en DrawingGroup para determinar qué geometría se alcanzó.
Nota:
En la mayoría de los casos, usaría el HitTest método para determinar si un punto interseca cualquiera de los contenidos representados de un objeto visual.
// 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
El método FillContains es un método sobrecargado que permite realizar pruebas de colisión mediante un Point o Geometry especificado. Si se traza una geometría, el trazo puede extenderse fuera de los límites de relleno. En ese caso, puede querer llamar a StrokeContains además de FillContains.
También puede proporcionar un ToleranceType que se usa para el aplanamiento de Bézier.
Nota:
Este ejemplo no tiene en cuenta ninguna transformación ni recorte que se pueda aplicar a la geometría. Además, este ejemplo no funcionará con un control con estilo, ya que no tiene ningún elemento gráfico asociado directamente a él.
Consulte también
.NET Desktop feedback