MouseDown und Click-Konflikt
Habe ich ein Ziehen () - Methode auf form_MouseDown Veranstaltung. Ich habe auch ein click-Ereignis auf dem Formular. Das problem ist, dass wenn ich auf dem Formular -, MouseDown-event wird ausgelöst, und es bekommt nie die chance auf trigger-Ereignis klicken.
Was ist der beste Weg, um dieses Problem zu lösen? Ich dachte die Pixel zählen, wenn das Formular tatsächlich gezogen, aber es muss einen besseren Weg geben. Irgendwelche Vorschläge?
- "zähl-Pixel" ist durchaus üblich, weil in den meisten Fällen, die Sie tatsächlich nicht wollen die ZIEHEN das Feuer aus, wenn die "Bewegung Strecke" kürzer ist, als z.B. 7..15 Pixel. Auch der windows-desktop hat sich so ein paar-pixel-Schwelle.
- Verwenden Sie nicht
Click
, und verwenden SieMouseUp
statt? - Ich erstellte eine demo und ich bin nicht immer dieses Verhalten. Nach dem MouseDown-Auf erreicht ist. Kannst du etwas code?
- Vielleicht ist er auch 'acks' die Veranstaltung Behandelt=wahr oder vergisst zu nennen, die Basis-Implementierung, etc?
- Wie wird das das problem lösen? Die
MouseUp
Ereignis noch ausgelöst wird, wenn der Benutzer die Maustaste loslässt, nach ein ziehen. DieClick
event ist eigentlich nur das Ereignis ausgelöst, nachdem ein Zyklus vonMouseDown
undMouseUp
Veranstaltungen. - common-handler für Drag und die tatsächliche klicken Sie auf. Zwei bedingten Verzweigungen, die entweder für action drinnen. Klicken Sie auf einem eigenen branch ansonsten erforderlich wäre, die zusätzlichen code, um die Synchronisierung mit MouseDown und MouseUp. In jedem Fall, es ist schwer zu sagen ohne mehr details von der OP.
Du musst angemeldet sein, um einen Kommentar abzugeben.
NÖ, das ist genau, wie Sie es zu tun haben.
Dies ist nicht nur eine software-Beschränkung, es ist sehr viel eine praktische als auch. Wenn Sie denken, das problem aus der Sicht des Benutzers, Sie werden sofort sehen das problem als auch die Lösung. Fragen Sie sich, was ist der Unterschied zwischen einem click und drag?
Beide beginnen mit der Maustaste geht nach unten über das Objekt, aber eine davon endet mit der Maus-Taste zurück gehen, bis über das Objekt in der gleichen position und die anderen enden mit der Maus-Taste zurück gehen, bis in einer ganz anderen position.
Seit der Zeit wurden die Maschinen noch nicht ausgereift aber Sie haben keine Möglichkeit zu wissen, im Voraus.
Also ja, müssen Sie pflegen eine Art von Distanz-Schwellenwert, und wenn der Zeiger bewegt sich außerhalb dieser Entfernung-Schwelle, während es nach unten über das Objekt, dann werden Sie denken, dass es ein ziehen. Ansonsten, überlegen Sie es auf.
Dass die Entfernung Schwellenwert sollte nicht 0 sein. Der Benutzer sollte nicht verlangt werden, halten Sie die Maus noch völlig, um zu initiieren klicken. Viele Nutzer sind sub-par Mäusefänger. Sie sind sehr wahrscheinlich zu zucken leicht, wenn Sie versuchen, um zu klicken. Wenn der Schwellenwert auf 0 ist, werden Sie am Ende tun eine Menge von unbeabsichtigten ziehen, wenn Sie versuchen, klicken Sie auf.
Natürlich, Sie haben tatsächlich nicht um irgendwelche von diesem oder berechnen Sie die drag-Schwelle selbst. Verwenden Sie stattdessen die Windows-Standard-Werte, erhältlich durch den Aufruf der
GetSystemMetrics
Funktion und AngabeSM_CXDRAG
oderSM_CYDRAG
. (Diese könnten ausgesetzt werden, irgendwo durch die WinForms framework, aber ich denke nicht so. Es ist einfach zu P/Invoke Sie sich.)Im Bereich UX/UI, diese Art von Ding heißt Hysterese oder entprellung, in Analogie zu der Verwendung dieser Begriffe in der Physik und Elektronik.
X
Pixel unter jedem anderen. Sie bevorzugen es, doppelklicken Sie auf das Steuerelement für den Zugriff auf die code-behind. So führen Sie dies 5px ziehen verzögern, so dass Sie nicht versehentlich ziehen und brechen Ihreexactly X pixels
Muster. Dies ist eine ziemlich künstliche use-case, aber trotzdem möglich mit der heutigen Welt. Also ja, ich bin damit einverstanden, in dieser situation kann es nützlich sein. Grafische Designer in der Regel nicht über diese ziehen Verzögerung. Es wird davon ausgegangen, dass Sie genaue Finger.GetSystemMetrics()
nennen, die oben gezeigt. Nur einige syntaktische Zucker.Fand ich diese Lösung, obwohl es für einen Doppelklick und ein mouse-down-events:
Quelle: http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html
Leider an diesem Punkt der Zeit, wenn " - Taste ist gedrückt," Sie weiß noch nicht, ob die gewünschte Aktion ist nur einen Klick oder eine drag & drop. Finden Sie es heraus, es später.
Für einen Klick, die Determinante ist "keine Bewegung" und "button up".
Für eine drag, die Determinante ist "Bewegung" und "button up".
Damit keine Verwechslungen diejenigen Interaktionen, die Sie haben zu verfolgen, nicht nur die Tasten, sondern auch die Bewegung. Sie brauchen nicht zu verfolgen, die Allgemeine Bewegung, nur die Bewegung zwischen button-down und button-up ist interessant.
Diese Ereignisse sind daher ein guter Ort zum starten/stoppen der Maus.Capture Mechanismen (dynamisch präsentieren ziehen funktionsindikatoren und drop-Position Hinweise), oder, in einfacher form zu speichern, die Ursprung und Ziel der Bewegung Vektor und überprüfen Sie, ob der Abstand > D (auch wenn eine Bewegung aufgetreten ist, sollte es sicher auf minimale Entfernung, innerhalb der das ZIEHEN ist canceleed. Die Maus ist der "gezackte" manchmal, wenn die Leute wirklich nicht, wie Sie Ihre app zu ziehen beginnen, wenn Sie Doppel-klicken Sie auf das Ende der schnellen Maus Bewegung 🙂 )