【问题标题】:Handled RoutedEvent continues to bubble up tree已处理的 RoutedEvent 继续冒泡树
【发布时间】:2010-08-09 21:57:39
【问题描述】:

我正在开发一个基于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] 所述,我将事件设置为已处理。

【问题讨论】:

    标签: c# wpf treeview treeviewitem routedevent


    【解决方案1】:

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

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

    WPF TreeView, get TreeViewItem in PreviewMouseDown event

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

    【讨论】:

      【解决方案2】:

      不知道为什么,但所选答案对我来说并不是对每个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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多