Drag-und-Drop auf ein TreeView, der Suche nach dem index-wo legen Sie die abgelegten Element
Ich habe eine WPF - TreeView
mit einer Ebene der untergeordneten Elemente. Ich bin mit der HierarchicalDataTemplate
für die top-level-Elemente, so dass die Kind-Elemente sind an einem Träger Daten-Liste.
Wenn ich dabei bin ziehen und ablegen ich möchte herausfinden, wo in der target-Liste die neuen Gegenstände gehen sollte. Ich habe gebrochen die Szenarien hinunter in den folgenden Fällen:
- Bin ich auf auf einen leeren Teil der Ziel -
TreeView
- Ich bin schweben auf oder in der Nähe einer der top-level -
TreeViewItem
s (dropped item muss gehen auf der Rückseite der Liste) - Ich bin schweben auf einer der Kind-Elemente, in dem Fall die abgelegten Element muss entweder auf der Vorderseite oder der Rückseite des aktuellen Elements, je nachdem ob ich schweben auf der oberen oder unteren Hälfte des Artikels.
Meine Frage ist, wie kann ich wissen, welche TreeViewItem
ich bin überfahren? Wie kann ich wissen, ob es ein parent-oder ein child-Typ TreeViewItem
? (Sie haben verschiedene DataContext
Datentypen) Sollte ich tun, irgendeine Art von hittesting? Wie kann ich wissen, welche top-level-Element besitzt das aktuelle child-Element ich bin überfahren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Versuch eine Reihe von Dingen, die ich glaube, ich habe kommen mit einem Weg, dies zu tun. Die
DragOver
undDrop
Veranstaltungen senden Sie eineDragEventArgs
parameter. Verwenden Sie diese zu tun, hit-testing. Wenn du hittest, obwohl, sind Sie wahrscheinlich nicht zu schlagen, die von Ihnen gewünschten Artikel direkt. Vielmehr sind Sie gehen zu werden etwas treffen, das ist Teil der Vorlage für das Element. Man die TreeViewItems Sie interessiert sind, können Sie versuchen, und gehen Sie die Visuelle Struktur.In diesem Beispiel die top-level -
TreeViewItems
gebunden sindGroupItem
Instanzen und der Kind-Knoten gebunden sindDragItems
Instanzen.tv
ist der name der TreeView-element selbst. In diesem code ist es sicher davon ausgehen, dass ich, wird es finden, da die event-Handler definiert werden, die auf dieses element.Habe ich den folgenden code, Spaziergänge auf den Baum.
Verbrauchen, wie diese. Beachten Sie die check für
IsVisible
was wichtig ist:Wenn Sie wollen, zu geben, eine Art visuelle Anzeige, wo das Objekt fallen wird, erwägen Sie die Verwendung einer adorner wie Bea Stollnitz hier erklärt. Sie können auch in Erwägung ziehen, eine Art von Wert auf die Gebundenen Daten-Klassen (wie ein
IsHovering
Eigenschaft, die das Element markieren per databinding)Hier ist ein einfacher präziser Weise, vielen Dank für die Richtung, obwohl Pieter Rasse.
Ich denke, es ist ein einfacher Weg, um zu bestimmen, die drop-TreeViewItem.
Innen private void Tree_Drop(object sender, DragEventArgs e), DragEventArgs e enthält 'OriginalSource' der Datentyp 'object'; während der Laufzeit wird es gegossen, um Daten Typ TextBlock. Innen 'OrginalSource', es ist 'DataContext'; während der Laufzeit wird es gegossen zu widersprechen, die in xaml definiert für TreeViewItem. So können Sie das Ziel TreeViewItem von (e.OriginalSource als TextBlock).DataContext als XXX.