2016-07-24 44 views
0

我試圖改變預設的時間量pictureBox當用戶單擊按鈕時的背景顏色。我嘗試使用計時器,但在另一個問題上我看到了Stopwatch。問題是循環內的代碼運行不正常,並且不斷崩潰。我該如何做這個工作?下面的代碼更改圖片箱backcolor的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

使用定時器。秒錶僅用於測量啓動和停止之間的時間(例如)。 – 2016-07-24 11:04:26

回答

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(); 
} 

另一種可能性,使用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;」但那麼你需要另一種方法。代碼更長。 – 2016-07-24 12:00:46

+0

在這裏,您只需使用以下方法訂閱Tick事件的文檔:https://msdn.microsoft.com/en-us/library/system.windows.forms.timer.tick(v=vs.110)。 ASPX – 2016-07-24 12:06:30

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 
     }; 
    }