Обработанные RouteEvent продолжает пузыгивать дерево
-
27-09-2019 - |
Вопрос
Я разрабатываю 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;