Ich hatte das vorher noch nie bemerkt, aber die WPF-ListBox scheint ihr SelectedItem zu ändern, wenn die Maus nicht aktiv ist, aber noch nicht veröffentlicht wurde. Als einfaches Beispiel erstellen Sie einfach eine einfache ListBox mit mehreren ListBoxItems, etwa so:
%Vor%Starten Sie Ihre Anwendung, drücken Sie die Maustaste (nicht loslassen!) und bewegen Sie die Maus herum. Das SelectedItem ändert sich mit der Mausbewegung. Dies veranschaulicht das größere Problem (zumindest für mich), dass das SelectedItem einer ListBox so bald gesetzt wird, wie Sie die Maustaste loslassen, nicht wenn die Maustaste losgelassen wird. Normalerweise ist das kein Problem, aber in meinem Fall würde ich gerne Drag & amp; Drop auf die Elemente in meiner ListBox, ohne dass die Elemente explizit ausgewählt werden.
Ich stelle mir vor, dass ich nur ein benutzerdefiniertes ItemsControl oder Selector mit Selection-Stil-Semantik ähnlich wie bei ListBox erstellen kann, also ist meine Frage wirklich mehr, warum funktioniert ListBox so? Hat jemand einen Einblick in das?
Es könnte etwas abseits sein, aber ich bin gerade auf ein ähnliches Problem gestoßen. Ich möchte nicht ziehen und ablegen, aber ich möchte Elemente auf ListBox auf MouseUp und nicht MouseDown auswählen. Obwohl Sheena Pseudocode einen Hinweis geben könnte, dauerte es noch eine Weile, bis ich die richtige Lösung gefunden hatte. Das ist also meine Lösung für mein Problem.
%Vor%Ich wollte auch nur mit der linken Maustaste auswählen. Im Falle eines Drag-and-Drop ist es notwendig, das ausgewählte Element in einem Maus-Down-Ereignis zu speichern und es dann im Mouse-Up-Ereignis zu verwenden. Ich hoffe, das wird jemandem helfen.
Ich persönlich bevorzuge MVVM und angehängte Eigenschaften, um das Verhalten von Elementen zu optimieren.
Außerdem scheint die von Tomas Kosar vorgeschlagene Lösung nicht zu funktionieren, wenn die ItemsSource-Eigenschaft gebunden ist.
Hier ist, was ich derzeit verwende (C # 7 Syntax)
%Vor%Nun können Sie dies auf jede ListBox (oder von einer Selector abgeleitete Klasse) anwenden, z. B.
%Vor%Ich gehe davon aus, dass Sie bereits versucht haben, ein neues Mouse-Down-Ereignis zu erstellen, das das tut, was Sie wollen, und das Standardverhalten auf diese Weise außer Kraft setzt ... hier ist ein Pseudo-Code, der den Trick machen sollte:
%Vor%Meine wpf skillz sind ein wenig eingerostet, aber ich denke, du musst das Item speichern und dann einen Container generieren, also ist dieser Pseudocode eine enorme Vereinfachung, aber der Algorithmus sollte den Trick machen.
Ich habe ein ähnliches Problem mit ListView
gefunden. Ich konnte nicht mit Drag-Drop eines Elements beginnen, ohne die Auswahl eines anderen zu verlieren.
Ich habe es gelöst, indem ich von ListView
abgeleitet habe und PreviewMouseDown
event gehandhabt habe. Stattdessen habe ich einen Gegenstand auf MouseUp ausgewählt.
Der Rest der Drag-Logik wird mit Reactive Extensions implementiert.
ListBox
ist ähnlich wie ListView
, also können Sie vielleicht nur von ListBox
ableiten und es wird funktionieren.
Code:
%Vor%