Unterscheiden zwischen Klicks und Doppelklicks
Frank Dzaebel, erstellt am:
1.11.2008, zuletzt geändert: 1.11.2008
Kategorie:Controls, .NET-Version:3.5, [Download]
Bei Controls, wie CheckBox und Button sind Ereignisse wie
DoubleClick zurecht nicht für die Intellisense sichtbar
und nicht direkt vorgesehen. Um es dennoch zu ermöglichen
hat das reine Aktivieren des "ControlStyles.StandardDoubleClick"
oft den Nachteil, dass das Click-Ereigniss dann doppelt (oder gar dreifach) ausgegeben wird. Verschiedene Verfahren bieten sich an. Hier ein Pattern, dass u.a. über die
"SystemInformation.DoubleClickTime"
implementiert ist.

Weiterführende Literatur:
Gewusst wie: Unterscheiden zwischen Klicks und Doppelklicks
Control.DoubleClick-Ereignis
/// <summary>CheckBox, die zusätzlich ein DoubleClick-Ereignis bereitstellt.</summary>
class CheckBoxDC : CheckBox
{
[Browsable(true)]
public new event EventHandler DoubleClick;
protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Clicks > 1) { doubleClicked = true; DoubleClick(this, mevent); }
else base.OnMouseDown(mevent);
}
volatile bool doubleClicked;
protected override void OnClick(EventArgs e)
{
new Thread(new ThreadStart(DoubleClickWarten)).Start();
}
void DoubleClickWarten()
{
doubleClicked = false; int start = Environment.TickCount;
while (Environment.TickCount - start < SystemInformation.DoubleClickTime)
Thread.Sleep(10);
if (!doubleClicked) Invoke(new ThreadStart(BaseOnClick));
}
void BaseOnClick() { base.OnClick(EventArgs.Empty); }
}
Folgende einfache Methode ist verführerisch und funktioniert auch, nur tritt einzig
bei einem DoubleClick auch ein Click auf, dessen Vermeidung der Zweck der oben angeführten
Implementation ist.
class CheckBoxDC : CheckBox
{
[Browsable(true)]
public new event EventHandler DoubleClick;
protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Clicks > 1) DoubleClick(this, mevent);
else base.OnMouseDown(mevent);
}
}