Frage

Ich entwickle eine TreeView basierte Steuerung und mein Doppelklickereignis weiter zu sprudeln meine TreeViewItem Knoten.

Das Ziel ist die TreeViewItem zu erweitern oder zu reduzieren zu haben, wenn es doppelt angeklickt wird.

Ich habe einen Stil, der zu jedem MouseDoubleClick einen Event-Handler für das TreeViewItem Ereignis gilt.

Hier ist der Code, dass Griffe das Ereignis


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

Das funktioniert gut für den Top-Level-TreeViewItem jedoch, wenn ein Kind Doppelangeklickt wird, sprudelt das Ereignis auf den Baum wodurch die gesamte Branche zu verkleinern. Warum setzt die Veranstaltung Blase? Wie bereits erwähnt eine [1] ich das Ereignis habe die Einrichtung als behandelt.

War es hilfreich?

Lösung

hasst meine eigenen Fragen zu beantworten, aber hier ist die Lösung, dass ich Gebrauch schließlich kam.

Nach über ein paar Quellen kommen, dass festgelegt, dass der Mousedoubleclick für jeden TreeViewItem in der Branche angehoben wird (vom Kind bis zur Wurzel) unabhängig davon, ob das Ereignis behandelt wird genutzt, ich die Antwort von dieser Frage:

WPF TreeView, get TreeViewItem in Preview Ereignis

, um die TreeViewItem zu erhalten, die unter dem Mausereignis war. Wenn der aktuelle Sender zum TreeViewItem des Mausereignisses gleich erweitern I / Zusammenbruch wie erforderlich. Ansonsten habe ich nur das Ereignis ignorieren und nichts tun.

Andere Tipps

Keine Ahnung, warum, aber die gewählte Antwort hat nicht funktioniert für jeden TreeViewItems für mich. Also ich fechten einen einfachen bool Ansatz von reeintering TreeViewItemDoubleClicked mehr als einmal.

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

Damit der erste Handler vollständig auszuführen aufgerufen (also auf die Tatsache stützen, dass ein Kind die Handler vor der Eltern es genannt wird), einfach hinzufügen:

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

Und vergessen Sie nicht, es zu registrieren.

treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top