处理过的RoutedEvent继续冒泡树

时间:2010-08-09 21:57:40

标签: c# wpf treeview treeviewitem 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]我将事件设置为已处理。

2 个答案:

答案 0 :(得分:1)

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

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

WPF TreeView, get TreeViewItem in PreviewMouseDown event

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

答案 1 :(得分:0)

不知道为什么,但选定的答案对我来说并不适用于每个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;