处理过的RoutedEvent继续冒泡树

我正在开发一个基于TreeView的控件,我的双击事件继续冒泡我的TreeViewItem节点。

目标是在双击时让TreeViewItem展开或折叠。

我有一个样式,将MouseDoubleClick事件的事件处理程序应用于每个TreeViewItem

这是处理事件的代码

 private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e ) { // Get the specific tree view item that was double clicked TreeViewItem treeViewItem = sender as TreeViewItem; // not null? if( null != treeViewItem ) { // Switch expanded state if( true == treeViewItem.IsExpanded ) { treeViewItem.IsExpanded = false; } else { treeViewItem.IsExpanded = true; } // Set event handled e.Handled = true; // [1] } } 

这适用于顶级TreeViewItem但是当双击子项时,事件会在树中冒泡,导致整个分支崩溃。 为什么事件继续泡沫? 如上所述[1]我将事件设置为已处理。

讨厌回答我自己的问题,但这是我最终使用的解决方案。

在遇到几个指定为分支中的每个TreeViewItem(从子级到根级)引发MouseDoubleClick的源之后,无论事件是否被处理,我都使用了这个问题的答案:

WPF TreeView,在PreviewMouseDown事件中获取TreeViewItem

获取鼠标事件下的TreeViewItem。 如果当前发送方等于鼠标事件的TreeViewItem,则根据需要展开/折叠。 否则,我只是忽略了这个事件而什么都不做。

不知道为什么,但选择的答案对我来说并不适用于每个TreeViewItems 。 因此,我使用了一种简单的bool方法,不止一次地重新烧结TreeViewItemDoubleClicked

 private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e ) { // Make sure the event has never been handled first if (bubblingBulkwark) return; // Get the specific tree view item that was double clicked TreeViewItem treeViewItem = sender as TreeViewItem; // not null? if( null != treeViewItem ) { // Switch expanded state if( true == treeViewItem.IsExpanded ) { treeViewItem.IsExpanded = false; } else { treeViewItem.IsExpanded = true; } // Raise bulkwark bubblingBulkwark = true; } } 

要允许调用的第一个处理程序完全执行(因此依赖于在父项的父级之前调用子级处理程序这一事实),只需添加:

 private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e) { bubblingBulkwark = false; } 

并且不要忘记注册它。

 treeView.PreviewMouseDown += TreeView_PreviewMouseDown;