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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top