Wir verwenden das MVVM-Muster in unserer Anwendung und in einem Fenster haben wir zwei TreeView
s, die es erlauben, Elemente von der ersten zu ziehen und sie auf die zweite Struktur zu legen. Um Code zu vermeiden, verwenden wir Verhaltensweisen, um das Ziehen und Ablegen an das ViewModel zu binden.
Das Verhalten ist ziemlich genau implementiert wie dieses Beispiel und funktioniert wie ein Zauber, mit einem Fehler.
Das Szenario ist ein Baum, der größer ist als das Fenster, in dem er angezeigt wird. Daher hat er eine vertikale Bildlaufleiste. Wenn ein Element ausgewählt ist und der Benutzer scrollen möchte, beginnt das Programm mit Ziehen und Ablegen (was das tatsächliche Scrollen verhindert und daher nicht das ist, was wir wollen).
Dies ist nicht sehr überraschend, da die Bildlaufleiste im Steuerelement TreeView
enthalten ist. Aber ich kann nicht sicher feststellen, ob sich die Maus über der Bildlaufleiste befindet oder nicht.
Die TreeViewItems
werden durch ein Thema dargestellt, das Borders, Panels usw. verwendet, also ist ein einfaches InputHitTest
nicht so einfach, wie man vielleicht denkt.
Ist schon jemand auf dasselbe Problem gestoßen?
Wenn mehr Code für das Problem benötigt wird, kann ich einige Zeilen aus der .xaml einfügen.
Bearbeiten
Integration von Nikolays Link Ich löste das Problem mit einer IsMouseOverScrollbar
Methode, wenn jemand dieses Problem in der Zukunft hat, muss der Code von oben wie folgt geändert werden:
Werfen Sie einen Blick auf diese Implementierung von Drag & Drop-Verhalten für ListView von Josh Smith . Es hat Code, um Scrollbars und einige andere nicht offensichtliche Probleme von DnD (wie Drag Schwelle, präzise Mauskoordinaten und so weiter) zu behandeln. Dieses Verhalten kann problemlos übernommen werden, um auch mit TreeViews zu arbeiten.
Tags und Links wpf c# treeview drag-and-drop behavior