Pregunta

Estoy desarrollando un control basado TreeView y mi evento de doble clic continúa burbuja mis nodos TreeViewItem.

El objetivo es tener el TreeViewItem expandir o contraer cuando se hace clic doble.

Tengo un estilo que se aplica un controlador de eventos para el evento MouseDoubleClick a cada TreeViewItem.

Este es el código que controla el 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]
    }
}

Esta multa obras para la TreeViewItem nivel superior sin embargo, cuando se hace doble clic en un niño, el evento se propaga por el árbol haciendo que toda la rama de colapso. ¿Por qué es el evento sigue burbuja? Como se ha observado un [1] Soy la creación del evento como manejada.

¿Fue útil?

Solución

El odio responder a mis propias preguntas, pero aquí está la solución que finalmente llegué a usar.

Luego de descubrir unas pocas fuentes que se especifica que el MouseDoubleClick se eleva para cada TreeViewItem en la rama (de niño hasta la raíz) sin tener en cuenta si se maneja el evento que utiliza la respuesta de esta pregunta:

WPF TreeView, obtener TreeViewItem en caso PreviewMouseDown

para obtener el TreeViewItem que estaba en el evento de ratón. Si el remitente actual es igual a la TreeViewItem del evento de ratón amplío / colapso según sea necesario. De lo contrario, simplemente ignorar el evento y no hacer nada.

Otros consejos

Ni idea de por qué, pero la respuesta seleccionada no funciona para todos los TreeViewItems para mí. Por lo que utiliza un enfoque sencillo de bool valla de reeintering TreeViewItemDoubleClicked más de una vez.

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;
    }
}

Para permitir que el primer manejador invoca para ejecutar completamente (por lo tanto, basándose en el hecho de que manejador de un niño se llamará antes de que sea de los padres), sólo tiene que añadir:

private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    bubblingBulkwark = false;
}

Y no se olvide para registrarlo.

treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top