Обработано RoutedEvent продолжает пузыриться в дереве - PullRequest
5 голосов
/ 10 августа 2010

Я разрабатываю элемент управления 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] Я устанавливаю событие как обработанное.

Ответы [ 2 ]

1 голос
/ 11 августа 2010

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

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

WPF TreeView, получить TreeViewItem в событии PreviewMouseDown

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

0 голосов
/ 15 апреля 2018

Понятия не имею почему, но выбранный ответ не сработал для каждого 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;
...