2013-01-23 21 views
0

我有一個名爲「TextModel」的對象。我爲它定義了一個HierarchicalDataTemplate。如何獲取包含數據模板對象的邏輯樹項目

這樣的:

<HierarchicalDataTemplate DataType="{x:Type local:TextModel}" 
          ItemsSource="{Binding Children}"> 
    <TextBlock x:Name="TextPresenter" 
      Text="{Binding Text}" 
      Style="{StaticResource TextModelStyleMouseOver}" /> 
</HierarchicalDataTemplate> 

這TextModel在我的TreeView包含在每個樹型視圖。 而且,在代碼隱藏中,我使用VisualTreeHelper.HitTest來獲取我單擊的TreeViewItem,但它不會將TreeViewItem作爲HitTest結果之一。 HitTest的結果是:TextBlock(和Border,Grid和ScrollViewer) - 我定義的HierarchicalDataTemplate中的一個。

我試過使用LogicalTreeHelper.GetParent(textBlockFromTheHitTestResults),但它返回給我一個null。

感謝您的關注!

回答

0

HitTest有一個overload你可以用它來篩選結果:

VisualTreeHelper.HitTest(
    root, 
    o => o is TreeViewItem ? HitTestFilterBehavior.ContinueSkipChildren : HitTestFilterBehavior.Continue, 
    r => 
     { 
      if (r.VisualHit is TreeViewItem) 
      { 
       DoSomethingWithTreeViewItem((TreeViewItem)r.VisualHit); 
       return HitTestResultBehavior.Stop; 
      } 

      return HitTestResultBehavior.Continue; 
     }, 
    new PointHitTestParameters(point)); 
+0

返回r.VisualHit-S就像我之前提到的: 的TextBlock,以及邊境線,網格和ScrollViewer中。 但有一些有趣的事實 - o實際上找到TreeViewItem,但隨後用r調用的HitTestResultCallback是Grid(上面寫的命中測試結果之一)。 所以我所做的就是將找到的o作爲TreeViewItem並保存在局部變量中,該變量將是您給我的此代碼的包裝方法的返回值。 –