Handled RoutedEvent continua ad albero bolla
-
27-09-2019 - |
Domanda
sto sviluppando un controllo TreeView
based e il mio doppio evento click continua a ribollire i miei nodi TreeViewItem
.
L'obiettivo è di avere il TreeViewItem
espandere o comprimere quando viene doppio clic.
Ho uno stile che applica un gestore di eventi per l'evento MouseDoubleClick
ad ogni TreeViewItem
.
Ecco il codice che gestisce l'evento
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]
}
}
Questo funziona bene per la TreeViewItem
livello superiore tuttavia quando un bambino è doppio clic, l'evento bolle l'albero causando l'intero ramo al collasso. Perché l'evento continua a bolla? Come notato un [1]
sto impostando l'evento come gestito.
Soluzione
L'odio rispondere alle mie domande, ma qui è la soluzione che alla fine è venuto a uso.
Dopo imbattersi in alcune fonti che precisa che il MouseDoubleClick è sollevata per ogni TreeViewItem nel ramo (da bambina fino alla radice), a prescindere se l'evento viene gestito Ho utilizzato la risposta da questa domanda:
WPF TreeView, get TreeViewItem in caso PreviewMouseDown
per ottenere il TreeViewItem che era sotto l'evento del mouse. Se il mittente corrente è uguale alla TreeViewItem dell'evento topo espando / compressione come richiesto. In caso contrario, ho solo ignorare l'evento e non faccio nulla.
Altri suggerimenti
Non ho idea perché, ma la risposta selezionata non ha funzionato per ogni TreeViewItems
per me. Così ho usato un approccio semplice bool
alla recinzione da reeintering TreeViewItemDoubleClicked
più di una volta.
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;
}
}
Per consentire il primo gestore invocato per eseguire completamente (quindi basandosi sul fatto che il gestore di un bambino sarà chiamato prima che sia del genitore), è sufficiente aggiungere:
private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
bubblingBulkwark = false;
}
E non dimenticate di registrarlo.
treeView.PreviewMouseDown += TreeView_PreviewMouseDown;