2012-01-07 71 views
0

嗨我有下面的代碼,過濾器回調被調用,但結果回調沒有,我一直在看這個一段時間,任何幫助,將不勝感激。HitTest結果回調不叫

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

關於「在可視層中進行命中測試」的MSDN文檔包含奇怪的注意事項「在未命中測試結果回調的情況下,有時會調用命中測試過濾器回調。沒有進一步的解釋爲什麼:http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_filter_callback

這是因爲afaik過濾器回調被稱爲整個可視化樹(的designerCanvas),而結果回調只被調用的那些真正被有問題的PointHitTestParameters命中的視覺效果。

如果你真的只想找到第一個節點(因爲它發現時返回HitTestResultBehavior.Stop),你不需要過濾。

嘗試省略過濾器回調以查看Node是否真的被擊中。呼叫

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

感謝您的答覆,我覺得你的解釋,使測試,而不是說得到了由試打的視覺效果,這是因爲過濾器經過整棵樹整個視覺樹的感覺,在這裏因爲沒有過濾器,結果回調僅返回返回兩個視覺效果。順便說一下,結果回調不捕捉節點,所以我用過濾器回調。 – mihajlv 2012-01-08 19:12:31