Laden...

Bei DragEnter zeitverzögert einen Klick ausführen, sofern nicht DragLeave getriggert wurde.

Erstellt von Frokuss vor 4 Jahren Letzter Beitrag vor 4 Jahren 830 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren
Bei DragEnter zeitverzögert einen Klick ausführen, sofern nicht DragLeave getriggert wurde.

Hallo Leute,

habe ein weiteres Problem mit den Drag-Events... Und zwar habe ich mich gestern mit folgen Sachverhalt auseinander gesetzt:

Ich möchte, wenn der Anwender bei meinem Label das DragEnter-Event triggert, dass nach 500ms die Klick-Routine aufgerufen wird. Verlässt der Anwender allerdings innerhalb der 500ms wieder das Label - es wird daher DragLeave getriggert, soll die Klick-Routine nicht ausgeführt werden.

Parziel funktioniert dies auch. Allerdings kann ich die Routine nur einmal abbrechen - danach ist der ganze Sachverhalt blockiert.
Soll heißen, ich fahre mit der Maus drüber und verlasse das Feld innerhalb der 500ms, so kann ich danach nicht mehr das Drag&Drop beenden.

Dies ist mein Code:

object _dragIn ;

//Das DragEnter-Event:
		private void Evt_DragEnter(object sender, DragEventArgs evt){
			_dragIn = sender;
			
			Helper_AsyncDragEnter(sender, evt);
		}

//Meine Hilfsfunktion:
		private async void Helper_AsyncDragEnter(object sender, DragEventArgs evt){
			await Task.Delay(500);
			
			if(_dragIn.Equals(sender) && _dragIn != null){
				Evt_ClickFocus(sender, (EventArgs)evt);
			}
		}

//Das DragLeave-Event
		private void Evt_DragLeave(object sender, EventArgs ect){
			_dragIn = null;
		}

Im Grund gehts mir hier um die Machbarkeit. Daher, ist dies Prinzipiel machbar, oder ist mein Gedanke hier mehr oder minder mit gewalt mittels des Kopfes durch die Wand zu kommen?

Eine alternatove Möglichkeit die mir einfallen würde, wäre eventuell über das Move-Event... Aber ob dies sinnvoller oder Performanter ist, kann ich nicht beurteilen. Im Grunde würde ich bei dem Move-Event (bzw. in dem Fall das DragEnter-Event) dann mir einen Timestamp setzen und in der Move-Routine die Differenz abfragen...

Aber vielleicht kann mir ja jemand sagen, welche der beiden alternativen sinnvoller wäre - und wenn es die erste Variante ist, was ich dafür brauche.

Liebe Grüße Frokuss

16.807 Beiträge seit 2008
vor 4 Jahren

Ich kann Dir beim konkreten Problem nicht helfen; aber bei gewissen Sachen die Augen öffnen:

    if(_dragIn.Equals(sender) && _dragIn != null){

Null-Checks sollten immer die ersten Prüfungen sein, sonst machts kein Sinn....

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Danke. Habe es jetzt hinbekommen. Habe den ganzen Code neugeschrieben... Muss wohl bei mir irgendwo ein logikfehler drin gewesen sein..

Grüße Frokuss