locked
zwischen normale Click und DoubleClick unterscheiden??? RRS feed

  • Frage

  • Hallo,

    wie kann ich es verhindern, dass bei einem DoppleClick nicht auch zweimal einfache linke MouseClick doppelt hintereinander ausgeführt wird?


    Gruesse, NUNUI

    Sonntag, 9. März 2014 14:13

Antworten

  • Hallo,
    was genau meinst du denn? Events wie MouseLeftButtonDown werden immer ausgeführt, egal wie geklickt wurde.

    Nachfolgend mal ein kleiner Beispielcode, der eine Nachricht ausgibt, je nachdem ob einmal oder doppelt geklickt wurde:

    const int waitTime = 300;//Anzahl in Millisekunden, zwischen 2 Klicks
    public MainPage()//Konstruktor
    {
        InitializeComponent();
    
        clickWaiter = new DispatcherTimer();
        clickWaiter.Tick += (s2, e2) =>
        {
            //Wird nach waitTime ms das Erste mal ausgelöst
            switch (clickCount)
            {
                case 1: OnClick(); break;
                case 2: OnDoubleClick(); break;//Events auslösen
            }
            clickCount = 0;//zurück setzen
            clickWaiter.Stop();//sich selbst deaktivieren
        };
        clickWaiter.Interval = TimeSpan.FromMilliseconds(waitTime);
    }
    
    int clickCount = 0;//Anzahl der Klicks
    DispatcherTimer clickWaiter;//Wartet waitTime ms nach jedem Mouse-Event
    
    //Dieses Event muss vom Control ausgelöst werden, dass die Mouse-Events verarbeiten soll private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { clickWaiter.Stop(); ;//Jetzigen Timer unterbrechen clickWaiter.Start();//Timer starten um waitTime ms abzuwarten ++clickCount;//Anzahl der Klicks erhöhen } //Nachfolgend die Events, in denen du deinen Code einfügst void OnClick() { //Einfach geklickt... MessageBox.Show("Einfacher Klick"); } void OnDoubleClick() { //Doppelt geklickt... MessageBox.Show("Doppelter Klick"); }
    Du musst waitTime so anpassen, wie es sich am besten "anfühlt". 300ms sind vielleicht etwas lang gewählt, so wird aber auch ein langsamer Maus-Bediener diesen hin bekommen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Nunui Montag, 10. März 2014 10:02
    Sonntag, 9. März 2014 15:36

Alle Antworten

  • Hallo,
    was genau meinst du denn? Events wie MouseLeftButtonDown werden immer ausgeführt, egal wie geklickt wurde.

    Nachfolgend mal ein kleiner Beispielcode, der eine Nachricht ausgibt, je nachdem ob einmal oder doppelt geklickt wurde:

    const int waitTime = 300;//Anzahl in Millisekunden, zwischen 2 Klicks
    public MainPage()//Konstruktor
    {
        InitializeComponent();
    
        clickWaiter = new DispatcherTimer();
        clickWaiter.Tick += (s2, e2) =>
        {
            //Wird nach waitTime ms das Erste mal ausgelöst
            switch (clickCount)
            {
                case 1: OnClick(); break;
                case 2: OnDoubleClick(); break;//Events auslösen
            }
            clickCount = 0;//zurück setzen
            clickWaiter.Stop();//sich selbst deaktivieren
        };
        clickWaiter.Interval = TimeSpan.FromMilliseconds(waitTime);
    }
    
    int clickCount = 0;//Anzahl der Klicks
    DispatcherTimer clickWaiter;//Wartet waitTime ms nach jedem Mouse-Event
    
    //Dieses Event muss vom Control ausgelöst werden, dass die Mouse-Events verarbeiten soll private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { clickWaiter.Stop(); ;//Jetzigen Timer unterbrechen clickWaiter.Start();//Timer starten um waitTime ms abzuwarten ++clickCount;//Anzahl der Klicks erhöhen } //Nachfolgend die Events, in denen du deinen Code einfügst void OnClick() { //Einfach geklickt... MessageBox.Show("Einfacher Klick"); } void OnDoubleClick() { //Doppelt geklickt... MessageBox.Show("Doppelter Klick"); }
    Du musst waitTime so anpassen, wie es sich am besten "anfühlt". 300ms sind vielleicht etwas lang gewählt, so wird aber auch ein langsamer Maus-Bediener diesen hin bekommen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Nunui Montag, 10. März 2014 10:02
    Sonntag, 9. März 2014 15:36
  • Danke für die Lösung. In meinem jetzigen Code sind für einfache Klick und DoppelKlick folgende Events schon vorhanden:

    this.AddHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(HandleMouseLeftButtonUp), true);
    
    private void HandleMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    { }
    
    
    
    this.AddHandler(CalendarView.DoubleClickEvent, new RoutedEventHandlerEx<DoubleClickRoutedEventArgs>(HandleCalendarDoubleClick));
    
    private void HandleCalendarDoubleClick(object sender, DoubleClickRoutedEventArgs e1)
    { }

    Wie könnte ich Deinen Vorschlag für meinen Code umsetzen?


    Gruesse, NUNUI

    Sonntag, 9. März 2014 20:25
  • Was genau ist CalendarView? Die Klasse scheint es zumindest in Silverlight 5 nicht zu geben.

    Es wirkt ein wenig seltsam, dass es ein DoubleClick aber kein einfaches Click-Event gibt.
    Da LeftButtonUp wahrscheinlich vor DoubleClick ausgelöst wird, würde ich auf das vorgefertigte DoubleClick-Event verzichten und stattdessen nur meine Methode benutzen.
    Alternativ kannst du auch das DoubleClick-Event weiter benutzen und aus meinem Code den Handler für DoubleClick heraus löschen.



    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 9. März 2014 20:42
  • DANKE !!! Es klappt wunderbar.


    Gruesse, NUNUI

    Montag, 10. März 2014 10:02