Como: Hit Test Geometry in a Visual
Esse exemplo mostra como realizar um teste de hit em um objeto visual composto de um ou mais objetos Geometry.
Exemplo
O exemplo a seguir mostra como recuperar o DrawingGroup de um objeto vidual que utiliza o método GetDrawing. Um teste de hit é então realizado no conteúdo renderizado de cada desenho no DrawingGroup para determinar qual geometria recebeu o hit.
Observação: |
---|
Na maioria dos casos, você poderia usar o HitTest método para determinar se um ponto de intercepta qualquer conteúdo processado de um 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.
}
}
}
}
O método FillContains é um método sobrecarregado que permite que você faça teste de hit utilizando um Point ou Geometry especificado. Se uma geometria tem traço, o traço pode estender para fora dos limites de preenchimento. Nesse caso, você pode quere chamar StrokeContains além de FillContains.
Você também pode fornecer um ToleranceType que e utilizado para ajuste de Bézier.
Observação: |
---|
Esse exemplo não considera quaisquer transformações ou clipping que possam ser aplicados à geometria. Além disso, esse exemplo não funcionará com um controle com estilo, pois não tem desenhos diretamente associados a ele. |
Consulte também
Tarefas
Como: Hit Test Using Geometry as a Parameter