Benutzer mit den meisten Antworten
WinForms, scroll-panel mit touch-screen

Frage
-
Hallo,
ich habe mir einen Container gebaut, der eine beliebige Anzahl
an WinForm-Pages aufnehmen kann diese dann horizontal seitenweise scrollen kann (eine Art Panorama-Control).
Der Container besteht im Wesentlichen aus einem Panel in dem ein TableLayoutPanel steckt,
das die WinForm-Pages added und verwaltet.
Funktioniert soweit gut, nun aber soll das ganze natürlich auch touch-screen fähig sein (so wie auf einem Smartphone,
wenn man die Pages wischt).
Dazu habe ich einen globalen Message-Filter applikationsweit angelegt der die MouseDown/Move/Up events
von der jeweiligen WinForm-Page bekommt und das Panel dann mittels AutoScrollPosition-Property scrollt.
Klappt auch, nur:
Wenn ich die aktuelle WinForm-Page z.B. mit "MousDown" und "MouseMove" über einem Child-Control (Button) bewege, wird beim Loslassen der Maus natürlich auch ein MouseUp-Event gefeuert und der Button macht sein Click-Event, was nicht gewünscht ist.
Also der Button soll nur dann klicken, wenn kein MouseMove "dazwischen" passiert und ansonsten nicht.
Aktuell habe ich das ganze mit boolschen-Variablen verriegelt, aber das kann man ja nicht für alle Children des Forms
machen. Wie könnte man das ganze besser lösen?
Ich verwende C#-WinForms, VS 2013 Prof. und Win 7.
Vielen Dank schon jetzt für Vorschläge und Tipps.
Viele Grüße.
Antworten
-
Hallo Dimitri,
im Beispiel wird auch mit abgeleiteten Controls gearbeitet, die Nachrichten an die Basis
weiterleiten oder nicht.
Der Trick ist das hier, funzt super!
protected override void OnClick(EventArgs e)
{
if (!_isScrolling) base.OnClick(e);
}
Ich danke Dir für Deine klasse Antwort und den Link!
GRuß, myamadeus.
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 5. August 2015 06:03
Alle Antworten
-
Hallo myamadeus,
Ich bin auf ein ähnliches Problem gestoßen, bei dem anfänglich auch eine boolesche Variable im Spiel war. Der Threadersteller ist dort zu einer Lösung gekommen, indem er mithilfe eines Dictionarys die Ereignisse der untergeordneten Steuerelemente abonniert oder das Abonnement kündigt. Hoffentlich wird dieses Beispiel auch Dir von Nutzen sein:
Intercepting and cancelling the Click event of a WinForms ButtonGruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo Dimitar,
vielen Dank für Deine Antwort. Ich dachte schon, keiner versteht mich :-)
Ja, mittlerweile hole ich von allen Child-Controls rekursiv die MouseDown/Move/Up Events in das Parent-Form.
Dort kann ich dann die Logik zum Scollen (bzw. bei touch Screen zum Verschieben) zusammenbauen. Wenn alles
gescrollt ist und der MouseUp-Event kommt, gebe ich das Mouse-Up an das enstprechende Child-Control wieder frei. ER jetzt das Child-Control wieder klickbar.
Das klappt aber nur wenn ich eigene, abgeleitete Controls verwende und dort die Ereignis je nach ZUstand an die Basis weiterleite oder nicht. Z.B.
if(!_bMoved)
base.OnMouseUp(sender, e);
Vielleicht geht es bei Deinem Beispiel leichter. Ich werde mir Deinen Link jetzt ansehen und ggfs. berichten...
Es gibt auch scheinbar auf CodePlex eine Lib die Keyboard und MouseEvents als Hooks intercepten kann.
http://globalmousekeyhook.codeplex.com/
Danke und Gruß, mymadeus.
-
Hallo Dimitri,
im Beispiel wird auch mit abgeleiteten Controls gearbeitet, die Nachrichten an die Basis
weiterleiten oder nicht.
Der Trick ist das hier, funzt super!
protected override void OnClick(EventArgs e)
{
if (!_isScrolling) base.OnClick(e);
}
Ich danke Dir für Deine klasse Antwort und den Link!
GRuß, myamadeus.
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 5. August 2015 06:03