这个很奇怪,除非我错过了一些基本的东西。
我已经通过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总是显示根节点的标题文本,而不是我双击的节点。我看不出有什么明显的错误。谁能给我指明正确的方向?
发布于 2015-08-17 03:08:38
是的,您缺少了关于TreeView的一个基本的奇怪的东西:)。我不知道如何在一篇文章中很容易地说明它,所以我会尝试解释它。TreeViewItem有子项。展开根TreeViewItem以显示子项时,所有这些子TreeViewItems都在父TreeViewItem的内部。因此,当您双击一个子TreeViewItem时,事件就会冒泡到最上面的项目。如果你看看e.OriginalSource,你会得到真正的物品.有点..。实际上,您将得到双击对象(例如,TextBlock)。您可以使用众所周知的GetVisualAncestor<T>()扩展方法来追踪到正确的TreeViewItem:
((FrameworkElement)e.OriginalSource).GetVisualAncestor<TreeViewItem>()是啊,很丑:).
这里有一个指向C#实现的链接,您必须为自己找到一个VB版本:),但是它的移植非常简单。
https://stackoverflow.com/questions/32042026
复制相似问题