Compartilhar via


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çãoObservaçã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çãoObservaçã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

Conceitos

Hit Testing in the Visual Layer