Вопрос

Я разрабатываю TreeView Control Control и My Double Click продолжает пузыться 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] Я устанавливаю мероприятие, как обрабатывается.

Это было полезно?

Решение

Ненависть отвечать на мои вопросы, но вот решение, которое я в конечном итоге пришел к использованию.

После нескольких источников, которые указали, что Mouseedoubleclick поднимается для каждого дерева VreeviewItem в ветке (от ребенка до корня) независимо от того, если событие обрабатывается, я использовал ответ от этого вопроса:

WPF TreeView, Получить TreeviewItem в PreviewMousedown Событие

Чтобы получить TreeviewItem, который был под событием мыши. Если текущий отправитель равен TreeviewItem события мыши, я расширяю / рухнул по мере необходимости. В противном случае я просто игнорирую мероприятие и ничего не делаю.

Другие советы

Не имею, почему, но выбранный ответ не работал на каждый 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top