none
WinForms, scroll-panel mit touch-screen RRS feed

  • 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.

    Mittwoch, 15. Juli 2015 12:56

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.

    Donnerstag, 16. Juli 2015 13:54

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 Button

    Gruß,
    Dimitar


    Bitte 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.

    Donnerstag, 16. Juli 2015 12:52
    Administrator
  • 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.

    Donnerstag, 16. Juli 2015 13:28
  • 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.

    Donnerstag, 16. Juli 2015 13:54