这个非常奇怪,除非我遗漏了一些非常基本的东西。
我已通过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
始终显示根节点的标题文本,而不是我双击的节点。我在这里看不到任何明显的错误。有人能指出我正确的方向吗?
答案 0 :(得分:1)
是的,你错过了一个关于TreeView的基本怪异事情:)。我不确定如何在帖子中轻松地说明它,所以我会尝试解释它。 TreeViewItem有子项。当您展开根TreeViewItem以显示子项时,所有这些子TreeViewItem都在父TreeViewItem内。因此,当您双击子TreeViewItem时,事件将冒泡到最顶层的项目。如果你看一下e.OriginalSource,你会得到实际的项目......有点......你实际上会得到你双击的对象(例如TextBlock)。您可以使用众所周知的GetVisualAncestor<T>()
扩展方法来追踪正确的TreeViewItem:
((FrameworkElement)e.OriginalSource).GetVisualAncestor<TreeViewItem>()
是的,这很难看:) ...
这是一个C#实现的链接,你必须为自己找到一个VB版本:),但它很容易移植。