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

有帮助吗?

解决方案

仇恨回答我的问题,但这里是解决方案,我最终来到了使用。

无论跨指定的MouseDoubleClick升高每个的TreeViewItem在分支(从儿童到根)几个来源的之后,如果所述事件被处理我利用从这个问题的答案:

WPF树视图,获取的TreeViewItem在PreviewMouseDown事件

得到的TreeViewItem那是鼠标事件下。如果当前的发送者等于鼠标事件的树型视图作为所需的I展开/折叠。否则,我只是忽略事件,什么也不做。

其他提示

不知道为什么,但所选择的答案没有工作,每TreeViewItems我。所以就用一个简单的bool方法围栏从reeintering 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top