На самом деле это не пузырящаяся проблема. Я видел это раньше. Даже когда вы сообщаете событию, что обрабатывали его, оно продолжает пузыриться. За исключением того, что я не думаю, что это на самом деле пузырится, а скорее запускает узел над собственным событием двойного щелчка. Я могу быть совершенно неправ в этом. Но в любом случае важно знать, что поговорка:
e.handled = true;
Ничего не делает, чтобы это не произошло.
Один из способов предотвратить такое поведение - заметить, что при двойном щелчке вы сначала нажимаете один раз, и что выбранное событие должно запускаться первым. Таким образом, хотя вы не можете остановить события двойного щелчка, вы должны иметь возможность проверить внутри обработчика, чтобы увидеть, должна ли выполняться логика событий. Этот пример использует это:
TreeViewItem selectedNode;
private void MouseDoubleClickEventHandler(object sender, MouseButtonEventArgs e)
{
if(selectedNode = e.Source)
{
//do event logic
}
}
private void TreeViewSelectedEventHandler(object sender, RoutedEventArgs e)
{
selectedNode = (TreeViewItem)e.Source;
}
Иногда, однако, возникают ситуации, когда узлы выбираются другими компонентами, а не посредством события TreeView SelectedItemChanged. В этом случае вы можете сделать что-то вроде этого. Если у вас есть TreeView с одним объявленным верхним узлом, вы можете дать этому узлу определенное имя и затем сделать что-то вроде этого:
bool TreeViewItemDoubleClickhandled;
private void MouseDoubleClickEventHandler(object sender, MouseButtonEventArgs e)
{
if (!TreeViewItemDoubleClickhandled)
{
//do logic here
TreeViewItemDoubleClickhandled = true;
}
if (e.Source == tviLoadTreeTop)
{
TreeViewItemDoubleClickhandled = false;
}
e.Handled = true;
}
Независимо от используемого вами метода, важно отметить, что по какой-либо причине при двойном щелчке TreeViewItem вы не можете остановить запуск событий по дереву. По крайней мере, я не нашел способ.