Как реализовать запуск и остановку таймера при каждой активации события мыши?
У меня есть таймер, а так же кнопка и событие мыши. При каждом событии "тик" таймера, генерируются два рандомных целочисленных значения. Но таймер не запускается при наведении курсора. Задача для таймера такова: он должен сгенерировать значения с определенной задержкой(int ed) при наведении курсора на кнопку. Т.е я думаю, что таймер должен запускаться после каждого использования события мыши, генерировать значение и передавать его в randPosX и randPosY, а потом отключаться. Но таймер не включается. Как это написать грамотно? Код события мыши:
private void button1_MouseMove(object sender, MouseEventArgs e)
{
int ed = 100;
timer1.Interval = ed;
timer1.Start();
button1.Location = new Point(randPosX, randPosY);
timer1.Stop();
}
код события таймера:
private void timer1_Tick(object sender, EventArgs e)
{
Random rand = new Random();
randPosX = rand.Next(340);
randPosY = rand.Next(340);
}
Ответы (2 шт):
А зачем вам здесь вообще таймер, кнопка должна начать беситься после первого наведения или просто убегать при каждом наведении?
private readonly Random rand = new Random();
private bool caught;
private void button1_MouseMove(object sender, MouseEventArgs e)
{
if (!caught) // если юзер уже поймал кнопку, не запускать таймер
timer1.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{
caught = true;
timer1.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
button1.Location = new Point(rand.Next(340), rand.Next(340));
}
Можно проще и без таймера
public class MyForm : Form
{
private Button _myButton;
private Random _myRandom = new Random();
public MyForm()
{
this.Width = 600;
this.Height = 600;
_myButton = new Button() { Text = "Hover me", Width = 140, Height = 60, Location = new Point(0, 0) };
this.Controls.Add(_myButton);
_myButton.MouseEnter += button_mouse_enter;
}
bool locked = false;
private async void button_mouse_enter(object sender, EventArgs args)
{
if (locked) return;
locked = true;
await Task.Delay(1000);
_myButton.Location = new Point(_myRandom.Next(500), _myRandom.Next(500));
locked = false;
}
}
Результат
