Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已处理的RouteEvent继续在树上冒泡_C#_Wpf_Treeview_Treeviewitem_Routedevent - Fatal编程技术网

C# 已处理的RouteEvent继续在树上冒泡

C# 已处理的RouteEvent继续在树上冒泡,c#,wpf,treeview,treeviewitem,routedevent,C#,Wpf,Treeview,Treeviewitem,Routedevent,我正在开发一个基于TreeView的控件,我的双击事件继续在TreeViewItem节点上冒泡 目标是使TreeViewItem在双击时展开或折叠 我有一种风格,它将MouseDoubleClick事件的事件处理程序应用于每个TreeViewItem 下面是处理该事件的代码 private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e ) { // Get the specific tree view

我正在开发一个基于
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的源之后,无论事件是否已处理,我使用了此问题的答案:


获取鼠标事件下的TreeViewItem。如果当前发送者等于鼠标事件的TreeViewItem,我将根据需要展开/折叠。否则,我只会忽略事件,什么也不做。

不知道为什么,但所选的答案对我来说并不适用于每个
树项。因此,我使用了一种简单的
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;