Warum ändert die WPF-Listbox die Auswahl mit der Maustaste statt mit der Maustaste?

8

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?

    
Jordan0Day 28.09.2011, 20:23
quelle

5 Antworten

5

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.

    
Tomas Kosar 09.07.2014, 13:06
quelle
5

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%     
Ziriax 01.04.2017 18:39
quelle
1

Ein alternativer Ansatz, der für mich zu funktionieren scheint:

%Vor%     
Brannon 23.04.2015 17:32
quelle
0

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.

    
Sheena 28.09.2011 20:35
quelle
0

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%     
tom.maruska 03.09.2014 12:04
quelle

Tags und Links