2015-08-17 4 views
0

Это действительно странно, если я не пропущу что-то действительно основное.MouseDoubleClick ошибочно TreeViewItem

Я приложил обработчик события к моим 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

У вас отсутствует одна из основных странных вещей о TreeView :). Не знаю, как я могу легко проиллюстрировать это в сообщении, поэтому я попытаюсь объяснить это. У TreeViewItem есть подпункты. Когда вы разворачиваете корневой TreeViewItem для отображения подпунктов, все эти sub TreeViewItems находятся внутри родительского 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

+0

Это было! Мне даже не нужен «GetVisualAncestor()». Мой «OriginalSource» - это сам «TreeViewItem». – dotNET

Смежные вопросы