MouseDoubleClick 获取错误的 TreeViewItem

MouseDoubleClick gets wrong TreeViewItem

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

我已通过 ItemContainerStyle:

将事件处理程序附加到我的 TreeViewItemMouseDoubleClick 事件
<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总是显示根节点的header文本,而不是我double-clicked所在的节点。我在这里看不到任何明显的错误。谁能指出我正确的方向?

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

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

是啊,很丑:)...

这是一个 link 的 C# 实现,您必须自己找到一个 VB 版本 :),但移植起来非常简单。

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