mogę obsłużyć zdarzenia MouseDown zacząć czasomierza, które przeprowadzą działania i zatrzymać go na razie mouseUp, ale Szukam łatwiejszy sposób rozwiązania tego problemu.
Możesz to ułatwić, pisząc raz w sposób wielokrotnego użytku. Można wyprowadzić własną klasę Button
, która ma to zachowanie.
Lub napisać klasę, którą można dołączyć do dowolnego przycisku, aby nadać temu zachowanie. Na przykład można zrobić coś takiego:
class ButtonClickRepeater
{
public event EventHandler Click;
private Button button;
private Timer timer;
public ButtonClickRepeater(Button button, int interval)
{
if (button == null) throw new ArgumentNullException();
this.button = button;
button.MouseDown += new MouseEventHandler(button_MouseDown);
button.MouseUp += new MouseEventHandler(button_MouseUp);
button.Disposed += new EventHandler(button_Disposed);
timer = new Timer();
timer.Interval = interval;
timer.Tick += new EventHandler(timer_Tick);
}
void button_MouseDown(object sender, MouseEventArgs e)
{
OnClick(EventArgs.Empty);
timer.Start();
}
void button_MouseUp(object sender, MouseEventArgs e)
{
timer.Stop();
}
void button_Disposed(object sender, EventArgs e)
{
timer.Stop();
timer.Dispose();
}
void timer_Tick(object sender, EventArgs e)
{
OnClick(EventArgs.Empty);
}
protected void OnClick(EventArgs e)
{
if (Click != null) Click(button, e);
}
}
Można by następnie używać go w sposób następujący:
private void Form1_Load(object sender, EventArgs e)
{
ButtonClickRepeater repeater = new ButtonClickRepeater(this.myButton, 1000);
repeater.Click += new EventHandler(repeater_Click);
}
lub bardziej zwięźle, ponieważ nie trzeba zachować odniesienie do ButtonClickRepeater
:
private void Form1_Load(object sender, EventArgs e)
{
new ButtonClickRepeater(this.myBbutton, 1000).Click += new EventHandler(repeater_Click);
}
Lepiej zrezygnować z subskrypcji zdarzenia Tick na MouseUp. –
Nie zapomnij również wyrzucić timera. – Joe
Używasz 'Timera', a metoda anonimowa jest tylko najkrótsza, zamiast zapisywania prawdziwej metody. Czy to nie istnieje w Framework 4.0? –