Laden...

Test auf MouseLeftButtonDown und MouseDoubleClick

Erstellt von Quaneu vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.211 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren
Test auf MouseLeftButtonDown und MouseDoubleClick

Hallo,

ich habe ein UserControl mit einem einfachen MouseLeftButtonDown-Event und einen MouseDoubleClick-Event.
Ich würde aber gern beim MouseDoubleClick-Event nicht davor das MouseLeftButtonDown-Event auslösen, was im jetzigen Fall immer mitausgelöst wird.

Daher muss ich nur MouseLeftButtonDown-Event implementieren und selber auf MouseDoubleClick testen, doch leider finde ich dazu nichts passendes, nur für Forms habe ich etwas gefunden, doch für WPF leider nichts.

Hat dies vielleicht schon mal wer in WPF gemacht?

Gruß

Quaneu

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

Ich wollte das Problem jetzt wie folgt lösen, doch leider klappt das nicht wirklich so wie ich es mir vorgestellt habe...


private TimerCallback;
private m_counter = 0;
private bool m_IsSingleClick;
private bool m_IsDoubleClick;

public BaseObject()
{
   m_DoubleClickDelegate = new TimerCallback(DoubleClick);
}

private void DoubleClick(object State)
{
   if (m_counter == 1)
   {
      m_IsSingleClick = true;
      m_IsDoubleClick = false;
   }
   else if (m_counter == 2)
   {
      m_IsDoubleClick = true;
      m_IsSingleClick = false;
   }
   m_DoubleClickTimer.Dispose();
}

protected void Relations(object sender, MouseButtonEventArgs e)
{
   m_counter++;
   m_DoubleClickTimer = new Timer(m_DoubleClickDelegate, e.ClickCount, 500, 0);

   ...

   m_counter = 0;
}

Das Problem ist nämlich, dass DoubleClick in einem eigenen Thread läuft und ich daher auf diesen warten müsste doch dies klappt auch nicht.
Ich weiß einfach nicht wie ich es umsetzten kann, das nur "DoubleClick" oder nur "SingleClick" ausgeführt wird.

Gruß

Quaneu

A
69 Beiträge seit 2010
vor 13 Jahren
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

So wie ich den Code verstehe, würde aber auch bei einem "DoubleClick" davor einmal der "SingleClick" auslöst. Und dies will ich gerade nicht haben.

Gruß
Quaneu

699 Beiträge seit 2007
vor 13 Jahren

So wie ich den Code verstehe, würde aber auch bei einem "DoubleClick" davor einmal der "SingleClick" auslöst. Und dies will ich gerade nicht haben.

Hast Du den Code mal ausprobiert?

Analog dazu, ist in Windows ein DoubleClick immer 2 SingleClick.

Um nun mit obiger Methode eine Unterscheidung zwischen Double- und SingleClick zu haben, würde ich im MouseLeftButtonDown_Click ein Delay rein machen, das der SingleClick dann erst als SingleClick gewertet wird, wenn nicht innerhalb der eingestellten Zeit dann ein DoubleClick erkannt wurde.

Grüße Stephan

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

Ja hab ich. Er funktioniert auch tadellos. Jedoch ist er für meine Zwecke nicht der Richtige, da er vor einem DoubleClick auch ein SingleClick "feuert".

Analog dazu, ist in Windows ein DoubleClick immer 2 SingleClick.

Genau das ist ja mein Problem. Ich will eben bei einem DoubleClick wirklich nur dieses Event und nicht davor das SingleClick.

Nur weiß ich nicht wirklich wie ich das mit dem "warten" machen muss. Sleep ist doch schlecht, da meine ganze GUI sonst stehen bleibt.
Werde mir aber gleich mal Delay anschauen.

Viele Grüße
Quaneu

A
69 Beiträge seit 2010
vor 13 Jahren

Starte beim singleclick einen Timer und werte nach ablauf des Timers aus, ob es einen zweiten click gab. Wenn nein, feuerst du ein SingleClickEvent ansonsten ein DoubleClickEvent.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

So hatte ich es schon versucht (siehe oben), doch hat es leider nicht so geklappt...
Ich werde es jetzt mal mit einem DispatcherTimer versuchen.

Gruß
Quaneu

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

Habs jetzt endlich geschafft mit Hilfe des DispatcherTimer.

Hier meine Lösung:


public class BaseObject : UserControl
{
   private DispatcherTimer m_timer = new DispatcherTimer();
   private int m_counter = 0;


   public BaseObject()
   {
      m_timer.Tick += new EventHandler(Timer_Tick);
      m_timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
   }

   public void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
   {
      m_counter++;
      m_timer.Start();
   }

   private void Timer_Tick(object sender, EventArgs e)
   {
      if (m_counter == 1)
      {
         // SingleClick
      }
      else if (m_counter == 2)
      {
          // DoubleClick
      }
      m_counter = 0;
      m_timer.Stop();
    }
}

Viele Grüße

Quaneu

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Quaneu,

verwende statt des hardcodierten Wertes lieber SystemInformation.DoubleClickTime.
Außerdem solltest du auch die Mausbewegung berücksichtigen - für ein (WinForms) Beispiel siehe Gewusst wie: Unterscheiden zwischen Klicks und Doppelklicks.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

Danke für die Tipps.

Doch hätte ich dazu gleich mal eine Frage.
SystemInformation.DoubleClickTime ist ja in der Assembly System.Windows.Forms, gibt es da auch was für WPF oder kann ich dies ohne bedenken einbinden?

Gruß
Quaneu

5.742 Beiträge seit 2007
vor 13 Jahren

oder kann ich dies ohne bedenken einbinden?

Ja - das stellt kein Problem dar.
Viele nützliche Klassen existieren leider nur in der System.Windows.Forms.dll.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 13 Jahren

Dann werd ich dies gleich mit einbinden und anpassen bzw. erweitern.

Und nochmals vielen Dank.

Quaneu