2016-03-08 2 views
1

У меня есть форма, содержащая кнопку, и я пытаюсь изменить цвет кнопки из другого потока, который находится в другом классе (от желтого до красного) но цвет остается прежним.Изменить цвет кнопки из другой темы

создания объекта (это в Form1):

Button b = new Button(); 
    b.Location = new Point(gameBoard[playerPosX,playerPosY].m_lbl.Location.X, gameBoard[playerPosX, playerPosY].m_lbl.Location.Y); 
    b.Parent = gameBoard[playerPosX, playerPosY].m_lbl; 
    b.BackColor = Color.Black; 
    b.Size = new Size(17, 17); 
    b.FlatStyle = FlatStyle.Flat; 
    b.Enabled = false; 
    b.Text = "BASIC"; 
    this.Refresh(); 
    b.BringToFront(); 
    buildings.Add(new Structure("basic", b,playerPosX,playerPosY)); 
    Controls.Add(buildings[buildings.Count - 1].m_btn); 

и это метод, который нить объекта делает:

public void basicOperation() 
    { 
     while (true) 
     { 
      Form1.ChangeControlColor(Color.Yellow,m_btn); 
      Thread.Sleep(1000); 
      Form1.ChangeControlColor(Color.Red,m_btn); 
     } 
    } 

и здесь form1.ChangeControlColor:

delegate void SetColorCallBack(Color c,Button b); 
    public static void ChangeControlColor(Color c,Button b) 
    { 
     if (b.InvokeRequired) 
     { 
      SetColorCallBack d = new SetColorCallBack(ChangeControlColor); 
      b.Invoke(d, new object[] { c,b }); 
     } 
     else 
     { 
      b.BackColor = c; 
      b.BringToFront(); 
      b.Refresh(); 
     } 
    } 

Следующий код не работает, а цвет кнопки остается желтым. Я ценю ваше время.

+0

Любые ошибки, вы шаг через код, делает 'else' положение никогда не срабатывает? – CodingGorilla

+0

Нет ошибок, когда я отлаживал код в ChangeControlColor, когда срабатывает условие if, кроме того, во время отладки я увидел, что b.BackColor был однажды Color.Red и один раз Color.Yellow. но я не видел никаких изменений в форме. –

+3

Также, если сработает инструкция else, почему вы ожидаете увидеть красный цвет, когда сразу измените его на Желтый. Положите задержку после установки на красный. – TYY

ответ

2

Eliran,

Ваш код многопоточность кажется хорошо.

Потому что нет никакой задержки между установкой цвета на красный и желтый, возможно, вы не видите ничего, кроме желтого.

Просто попробуйте добавить задержку между настройкой цвета желтый и красный:

while (true) 
    { 
     Form1.ChangeControlColor(Color.Yellow,m_btn); 
     Thread.Sleep(500); 
     Form1.ChangeControlColor(Color.Red,m_btn); 
     Thread.Sleep(500); 
    } 

С уважением

+0

Спасибо, он работает. –

+0

Ты хочешь сказать, что тебе даже не нужен мой ответ. Если вы этого не сделаете, я удаляю его –

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