Behandelt RoutedEvent weiterhin sprudeln tree
-
27-09-2019 - |
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.
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;