MouseDoubleClick获取错误的TreeViewItem

时间:2015-08-17 02:35:44

标签: wpf xaml events treeview

这个非常奇怪,除非我遗漏了一些非常基本的东西。

我已通过TreeViewItem向我的MouseDoubleClick ItemContainerStyle事件附加了一个事件处理程序:

<TreeView.ItemContainerStyle>
  <Style TargetType="TreeViewItem">
    <EventSetter Event="MouseDoubleClick" Handler="TreeViewItem_MouseDoubleClick" />
  </Style>
</TreeView.ItemContainerStyle>

这是事件处理程序:

Private Sub TreeViewItem_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs)

  If TypeOf sender Is TreeViewItem Then
    Dim TVI = DirectCast(sender, TreeViewItem)
    MsgBox(TVI.Header)
  End If
End Sub

问题是MsgBox始终显示根节点的标题文本,而不是我双击的节点。我在这里看不到任何明显的错误。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

是的,你错过了一个关于TreeView的基本怪异事情:)。我不确定如何在帖子中轻松地说明它,所以我会尝试解释它。 TreeViewItem有子项。当您展开根TreeViewItem以显示子项时,所有这些子TreeViewItem都在父TreeViewItem内。因此,当您双击子TreeViewItem时,事件将冒泡到最顶层的项目。如果你看一下e.OriginalSource,你会得到实际的项目......有点......你实际上会得到你双击的对象(例如TextBlock)。您可以使用众所周知的GetVisualAncestor<T>()扩展方法来追踪正确的TreeViewItem:

((FrameworkElement)e.OriginalSource).GetVisualAncestor<TreeViewItem>()

是的,这很难看:) ...

这是一个C#实现的链接,你必须为自己找到一个VB版本:),但它很容易移植。

https://code.google.com/p/gong-wpf-dragdrop/source/browse/branches/jon/GongSolutions.Wpf.DragDrop/Utilities/VisualTreeExtensions.cs?r=29