WPF ListView-Datenbindung per Drag/Drop Auto-Scroll
Arbeite ich mit Bea ' s Lösung hier für eine Weile und finden es sehr hilfreich. Problem jetzt das ich habe ist, wenn ich per drag-n-drop-Elemente, die innerhalb oder in ein anderes ListView-Steuerelement, und ich möchte, um den Bildlauf nach oben/nach unten "während der" ziehen (verschieben eines Elements von der index 30 index 1), ist es nicht passiert. Ich würde ziehen müssen, um die Spitze der visuellen Elemente im ListView-Steuerelement manuell nach oben scrollen, dann wieder ziehen, schließlich endet an der position, die ich möchte. Dies ist nicht sehr benutzerfreundlich.
Jetzt fand ich die Funktion (DragDropHelper.DropTarget_PreviewDragOver), ich würde wollen, um die Tests zu tun, welches Element gezogen wird, vorbei, und ich bekomme, dass.
Dim pt As Point = e.GetPosition(DirectCast(Me.targetItemsControl, UIElement))
' Perform the hit test against a given portion of the visual object tree.
Dim result As HitTestResult = VisualTreeHelper.HitTest(Me.targetItemsControl, pt)
Nun von dort bekomme ich die DependencyProperty dieses visual Treffer
Dim lvi As ListViewItem = TryCast(GetDependencyObjectFromVisualTree(TryCast(result.VisualHit, DependencyObject), GetType(ListViewItem)), ListViewItem)
Ist ein ListViewItem. Jetzt in der Funktion DropTarget_PreviewDragOver ich habe die "DraggedItem", die vom Typ Bild in der Bea ' s Beispiel, aber das kann sich ändern, abhängig von der ObservableCollection du gebunden an das ListView-Steuerelement. Nun, ich will ziehen Sie das ListView-Steuerelement nach oben oder unten, je nachdem, wo der Mauszeiger auf dem Steuerelement. Ich habe versucht, mit dem unter un-fertige, nicht-funktionierenden code
If lvi IsNot Nothing Then
If pt.Y <= 25 Then
Dim lv As ListView = TryCast(targetItemsControl, ListView)
If lv IsNot Nothing Then
Dim index As Integer = lv.Items.IndexOf(lvi)
If index > 1 Then
lv.ScrollIntoView(lv.Items(index - 1))
End If
End If
Else
If pt.Y >= Me.targetItemsControl.ActualHeight - 25 Then
Debug.Print("Scroll Down")
End If
End If
End If
Kann mir jemand zeigen in die richtige Richtung zu bekommen, das ItemsControl oder ListView zu scrollen beim ziehen der Maus über die Elemente??
Dank!
- Hi, Hast du eine Lösung finden? Cheers
- Sorry, ich habe noch nicht Zeit gehabt, zu schauen, in diesem mehr. Haben Sie lief über etwas, seit Sie gepostet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin immer noch Herumspielen mit genau dem gleichen Problem auch. Ich verwende eine leicht modifizierte version von Bea ' s Drag-and-Drop gefunden hier, das ist in VB anstatt C#. Wenn ich ScrollIntoView wie oben beschrieben, konnte ich nach unten scrollen aber nicht nach oben. So ich Durcheinander herum und kam mit dieser als mein DropTarget_PreviewDragOver:
und ich hatte, um diese utility-Funktion, entnommen aus hier
die ist toll und alles. Dann läuft was theuberk oben erwähnt mit der adorner bewegen, und in den Geist, so dass dies einfach für jemand anderes später habe ich noch eine variable, um die DragDropAdorner Klasse:
Hinzugefügt, die Letzte Zeile von DragSource_PreviewMouseLeftButtondown:
Sich und drehte ShowDraggedAdorner in:
Was ich Tat, war, nutzten die
ListBox.ScrollIntoView
Methode. Grundsätzlich, wenn Sie aktualisieren Sie Ihre drop-Ziel, können Sie einfach rufen Sie diese Methode auf und wpf wird die ganze Arbeit machen. Alles, was Sie wissen müssen, ist, den index der drop-target-Element. Diese Griffe sowohl vertikal als auch horizontal scrollen.this.listView.ScrollIntoView(this.listView.Items[index]);
Wenn Sie diese Methode verwenden, Ihre adorner vielleicht bewegen Sie mit den Bildlauf-Listenfeld. Um dies zu beheben, habe ich einfach meinen adorner Eltern und adorner übergeordneten Ebene auf den Inhalt der Fenster an der Spitze der visuellen Struktur (d.h.
topWindow.Content
).Andere Möglichkeit zu navigieren ist das benutzen der ScrollBar-Befehle. Sie können dies tun, ohne klettern unten der VisualTree. Wenn Sie ein ListBox-styles mit keine Grenze der GetScrollViewer()-Methode nicht mehr funktioniert.
Ich benutze das erste Element des ItemContainerGenerator als CommandTarget für die ScrollBar.LineXXXCommand:
Aufruf der LineXXXCommands ist ähnlich wie einem Klick auf den Pfeil-Tasten von einem ScrollBar: Der ScrollViewer scrolles durch eine bestimmte Menge, die Sie konfigurieren können, indem die Einstellung des SmallAmount' - Eigenschaft der Bildlaufleiste.