2013-03-21 65 views
0

我遇到一些麻煩,試圖通過HitTestResultCallback訪問用戶控件,我可以找到我的用戶裏面所有的控制,但我想要做的就是訪問用戶控件類,這裏是我的代碼:HitTestResultCallback找不到用戶控件

public void DragStartInteraction() 
    { 
     VisualTreeHelper.HitTest(Application.Current.MainWindow, null, new HitTestResultCallback(myCallbackDragStartEvent), new PointHitTestParameters(_currentPoint)); 

     ... 
    } 

    private HitTestResultBehavior myCallbackDragStartEvent(HitTestResult result) 
    { 
     ... 

     UserControl el = result.VisualHit as UserControl; 

     ... 

     return HitTestResultBehavior.Continue; 
    } 

謝謝!

回答

2

HitTestResultCallback將僅針對實際具有渲染內容的視覺樹中的視覺效果調用。例如,在Label控件中,回調將只返回組成Label的Border和TextBlock,但不會返回Label控件本身。您的UserControl也是如此。

您可以通過調用VisualTreeHelper.GetParent從傳遞給HitTestResultCallback的圖像中獲取UserControl。您也可以提供HitTestFilterCallback。這個回調得到在視覺樹中的每個視覺,你可以簡單地停止時,用戶控件中通過遍歷樹。

VisualTreeHelper.HitTest(
    Application.Current.MainWindow, 
    obj => 
    { 
     if (obj is UserControl) 
     { 
      // found it 
      return HitTestFilterBehavior.Stop; 
     } 
     return HitTestFilterBehavior.Continue; 
    }, 
    result => HitTestResultBehavior.Continue, 
    new PointHitTestParameters(_currentPoint)); 

如果你想獲得一次以上的匹配用戶控件,也許是因爲他們在重疊您正在測試的點,或者您正在使用命中的測試幾何體進行測試,則可以通過返回HitTestFilterBehavior.ContinueSkipChildren繼續過濾。

+0

我得到了相同的結論,不幸的是不能過濾使用HitTestFilterCallback,我認爲這應該是我們無法找到HitTestResultCallback UserControl的同樣原因,但無論如何感謝。 – 2013-03-22 14:25:48

+0

我不認爲這是「我們無法在HitTestResultCallback上找到UserControl的相同原因」。這些回調肯定要求一組不同的視覺效果。上面顯示的解決方案至少用我測試過的簡單UserControl工作。 – Clemens 2013-03-22 15:37:44

+0

我的不好,它使用過濾器。在我的解決方案中,我沒有過濾,只是從最頂級的UIElement獲得父級,它解決了我的問題,但很好的知道它可以通過用戶控制進行過濾,這是做同樣事情的更好方法。謝謝! – 2013-03-22 18:19:20