Compartilhar via


Como: Hit Test Using Geometry as a Parameter

Esse exemplo mostra como realizar um teste de hit em um objeto visual utilizando um Geometry como um parâmetro do teste de hit.

Exemplo

O exemplo a seguir mostra como configurar um teste de hit utilizando GeometryHitTestParameters para o método HitTest. O valor Point que é passado para o método OnMouseDown é utilizado para criar um objeto Geometry para expandir a faixa do teste de hit.

// Respond to the mouse button down event by setting up a hit test results callback.
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // Expand the hit test area by creating a geometry centered on the hit test point.
    EllipseGeometry expandedHitTestArea = new EllipseGeometry(pt, 10.0, 10.0);

    // Clear the contents of the list used for hit test results.
    hitResultsList.Clear();

    // Set up a callback to receive the hit test result enumeration.
    VisualTreeHelper.HitTest(myControl, null,
        new HitTestResultCallback(MyHitTestResultCallback),
        new GeometryHitTestParameters(expandedHitTestArea));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        ProcessHitTestResultsList();
    }
}

A propriedade IntersectionDetail do GeometryHitTestResult oferece informação sobre os resultados de um teste de hit que utiliza um Geometry como um parâmetro de teste de hit. A seguinte ilustração mostra o relacionamento entre a geometria de teste de hit (o círculo azul) e o conteúdo renderizado do objeto visual de alvo (o quadrado vermelho).

Interseção entre a geometria de teste de hit e o objeto visual de alvo

Diagrama de IntersectionDetail usado no teste de clique

O seguinte exemplo mostra como implementar um callback de teste de hit quando um Geometry é utilizado como parâmetro de teste de hit. O parâmetro result é passado em um GeometryHitTestResult para recuperar o valor da propriedade IntersectionDetail. O valor de propriedade permite que você determine se o parâmetro de teste de hit Geometry está completa ou parcialmente contido no conteúdo renderizado do alvo do teste de hit. Nesse caso, o código de exemplo só está acrescentando resultados do teste de hit à lista de visuais que estão completamente contidos nas fronteiras do alvo.

// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResultCallback(HitTestResult result)
{
    // Retrieve the results of the hit test.
    IntersectionDetail intersectionDetail = ((GeometryHitTestResult)result).IntersectionDetail;

    switch (intersectionDetail)
    {
        case IntersectionDetail.FullyContains:

            // Add the hit test result to the list that will be processed after the enumeration.
            hitResultsList.Add(result.VisualHit);

            return HitTestResultBehavior.Continue;

        case IntersectionDetail.Intersects:

            // Set the behavior to return visuals at all z-order levels.
            return HitTestResultBehavior.Continue;

        case IntersectionDetail.FullyInside:

            // Set the behavior to return visuals at all z-order levels.
            return HitTestResultBehavior.Continue;

        default:
            return HitTestResultBehavior.Stop;
    }
}
ObservaçãoObservação:

O HitTestResult retorno de chamada não deve ser chamado quando o detalhe de interseção é Empty.

Consulte também

Tarefas

Como: Hit Test Geometry in a Visual

Conceitos

Hit Testing in the Visual Layer