2016-07-24 4 views
0

Я пытаюсь изменить для заданного промежутка времени обратную цвету pictureBox, когда пользователь нажимает кнопку. Я пытался использовать таймеры, но я видел это Stopwatch по другому вопросу. Проблема в том, что код внутри цикла не работает должным образом, и он продолжает сбой. Как я могу это сделать? Код нижеИзменить обратную цветную картинку для x количество времени

private void b_click(object sender, EventArgs e) 
{ 
    Button button = sender as Button; 
    Dictionary <Button, PictureBox> buttonDict= new Dictionary<Button, PictureBox>(); 
    //4 buttons 
    buttonDict.Add(bRED, pbRED); 
    buttonDict.Add(bBlue, pbBLUE); 
    buttonDict.Add(bGREEN, pbGREEN); 
    buttonDict.Add(bYELLOW, pbYELLOW); 
    Stopwatch s = new Stopwatch(); 
    s.Start(); 
    while (s.Elapsed < TimeSpan.FromSeconds(0.5)) 
    { 
     buttonDict[button].BackColor = Color.Black; 
     label1.Text = "black";//This part does run 
    } 
    buttonDict[button].BackColor = Color.White; //the pictureBox does turn white 
    s.Stop(); 
} 
+0

Использование таймера , Секундомер предназначен только для измерения времени между пуском и остановкой (например). –

ответ

1

Использование таймера вместо Секундомер:

private void b_Click(object sender, EventArgs e) 
{ 
    Button button = sender as Button; 
    Dictionary<Button, PictureBox> buttonDict = new Dictionary<Button, PictureBox>(); 
    //4 buttons 
    buttonDict.Add(bRED, pbRED); 
    buttonDict.Add(bBlue, pbBLUE); 
    buttonDict.Add(bGREEN, pbGREEN); 
    buttonDict.Add(bYELLOW, pbYELLOW); 
    Timer timer = new Timer(); 
    timer.Interval = 500; 
    timer.Tick += (o, args) => 
    { 
    buttonDict[button].BackColor = Color.White; 
    timer.Stop(); 
    timer.Dispose(); 
    }; 
    buttonDict[button].BackColor = Color.Black; 
    label1.Text = "black"; 
    timer.Start(); 
} 

Another возможности, используя Task.Run:

private void b_Click(object sender, EventArgs e) 
{ 
    Button button = sender as Button; 
    Dictionary<Button, PictureBox> buttonDict = new Dictionary<Button, PictureBox>(); 
    //4 buttons 
    buttonDict.Add(bRED, pbRED); 
    buttonDict.Add(bBlue, pbBLUE); 
    buttonDict.Add(bGREEN, pbGREEN); 
    buttonDict.Add(bYELLOW, pbYELLOW); 
    buttonDict[button].BackColor = Color.Black; 
    label1.Text = "black"; 
    Task.Run(() => 
    { 
    Thread.Sleep(500); 
    Invoke(new MethodInvoker(() => 
    { 
     buttonDict[button].BackColor = Color.White; 
    })); 
    }); 
} 
+0

Отлично. Что делает '+ = (o, args) =>' tho? @x ... – Newbie404

+0

Просто замена для подписки на мероприятие. Вы также можете использовать «timer.Tick + = OnTimerTick;» но для этого вам нужен другой метод. Код длиннее. –

+0

Здесь вы найдете только документацию для подписки на мероприятие Tick, используя метод: https://msdn.microsoft.com/en-us/library/system.windows.forms.timer.tick(v=vs.110). ASPX –

0

использовать что-то вроде этого:

private void b_click(object sender, EventArgs e) 
    { 
     pictureBox1.BackColor = Color.Black; //First color 
     new System.Threading.Tasks.Task(() => PictureBoxTimeoutt(1000)).Start(); //miliseconds until change 
    } 

    public void PictureBoxTimeout(int delay) 
    { 
     System.Threading.Thread.Sleep(delay); 
     Invoke((MethodInvoker)delegate 
     { 
      pictureBox1.BackColor = Color.White; //Second color 
     }; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^