Mausklick in Win.Forms per Reactive Extensions abfragen

Die Reactive Extensions von Microsoft können schon ein cooles Werkzeug sein. Wer sich schon einmal damit beschäftigt hat, weiß, dass dieses Framework vom Funktionsumfang her eine sehr gute Ergänzung ist, von der Syntax her aber sehr ungewohnt.

Ein gutes Beispiel dafür habe ich neulich bei einem relativ einfachen Thema gemacht: Einen einfachen Mausklick in einem Windows.Forms Panel abfangen. Das Standard-Ereignis konnte ich nicht nehmen, da dieses auch dann feuert, wenn die Maustaste länger unten gehalten wurde. In diesem Fall möchte ich das Ereignis aber nicht, da länger gedrückte Maustaste in diesem Fall eine andere Bedeutung hat.

Was würde man also normalerweise ohne Reactive Extensions in diesem Fall machen? Die Ereignisse MouseDown und MouseUp separat abonnieren, in ersteren einen Zeitstempel merken, gegen den man dann in letzteren prüfen kann, ob wirklich ein Klick stattgefunden hat. Nachteilig: Die Logik für diese Abfrage ist damit etwas verzweigt. Man bekommt zwei Event-Handler und einen zusätzlichen Member, was die Klasse nur unnötig komplexer macht. Man will ja schließlich nur einen Klick abfragen!

Ich habe mich also kurz hingesetzt und versucht, eben dieses Thema per Reactive Extensions zu lösen. Herausgekommen ist folgender Code.

Sieht nach etwas viel Code für ein kleines Problem aus, lässt sich aber erstaunlich gut lesen und verstehen, wenn man den Code von oben nach unten durchgeht. Vorteil an dieser Variante ist, dass die Erkennungslogik für den Mausklick an einer Stelle steht. Weiterhin hat man nur ein Ereignis, welches man registrieren muss (das Subscribe).

Quellen:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.