5

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

4

2 回答 2

2

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

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

WPF TreeView,在 PreviewMouseDown 事件中获取 TreeViewItem

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

于 2010-08-10T21:32:53.150 回答
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;
于 2018-04-15T14:43:55.633 回答