MouseDoubleClick 获取错误的 TreeViewItem
MouseDoubleClick gets wrong TreeViewItem
这个真的很奇怪,除非我遗漏了一些非常基本的东西。
我已通过 ItemContainerStyle
:
将事件处理程序附加到我的 TreeViewItem
的 MouseDoubleClick
事件
<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 版本 :),但移植起来非常简单。
这个真的很奇怪,除非我遗漏了一些非常基本的东西。
我已通过 ItemContainerStyle
:
TreeViewItem
的 MouseDoubleClick
事件
<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 版本 :),但移植起来非常简单。