Результат обратного вызова HitTest не вызывается - PullRequest
1 голос
/ 08 января 2012

Привет, у меня есть следующий код, обратный вызов фильтра вызывается, но обратный вызов результата - нет, я уже давно смотрю на это, любая помощь будет признательна.

   public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
   {
        s += o.ToString() + " ";
        //Test for the object value you want to filter.
        if (o.GetType() != typeof(Node))
        {
            // Visual object and descendants are NOT part of hit test results enumeration.
            return HitTestFilterBehavior.ContinueSkipSelf;
        }
        else
        {
            s+="node detected ";
            // Visual object is part of hit test results enumeration.
            return HitTestFilterBehavior.Continue;
        }
    }

Вот код для обратного вызова результата:

public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
       s += "in result callback ";
       if (result.VisualHit.GetType() == typeof(Node))
        {
            hitResultsList.Add(result.VisualHit as Node);
            s+= "node detected in result callback "
            return HitTestResultBehavior.Stop;

        }
        return HitTestResultBehavior.Continue;
 }

Вот как я называю тест на попадание:

 hitResultsList.Clear();
        VisualTreeHelper.HitTest(designerCanvas, new HitTestFilterCallback(MyHitTestFilter), new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(End));

Теперь обратный вызов фильтра проходит через все элементы и находит узел, однако обратный вызов результата вообще не вызывается.

1 Ответ

2 голосов
/ 08 января 2012

Документ MSDN «Тестирование попаданий в визуальном слое» содержит странное примечание: «Обратный вызов фильтра проверки попаданий иногда вызывается в тех случаях, когда обратный вызов результатов проверки попаданий не вызывается». без дальнейших объяснений, почему: http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_filter_callback

Это потому, что afaik обратный вызов фильтра вызывается для всего визуального дерева (designerCanvas), тогда как обратный вызов результата вызывается только для тех визуальных элементов, которые действительно пострадали от рассматриваемых PointHitTestParameters.

Если вы действительно хотите найти только первый узел (когда вы возвращаете HitTestResultBehavior.Stop, когда он найден), вам все равно не нужно фильтровать.

Попробуйте пропустить обратный вызов фильтра, чтобы увидеть, действительно ли достигнут узел. Позвоните

VisualTreeHelper.HitTest(designerCanvas, null, MyHitTestResult, new PointHitTestParameters(End));
...