Как изменить backColor кнопки до конца блока кода во время выполнения - PullRequest
0 голосов
/ 14 марта 2019
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  private void button1_Click(object sender, EventArgs e)
  {
    button1.BackColor = Color.Lime;
    Thread.Sleep(5000);
    button1.BackColor = Color.DarkGreen;
  }
}

button1 уже DarkGreen. когда я нажимаю кнопку 1, ничего не меняется.

Как я могу наблюдать это изменение в течение 5 секунд?

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Ваша проблема в том, что поток пользовательского интерфейса блокируется. Вам нужно запустить эту логику в отдельном потоке. Попробуйте этот код вместо:

private async void button1_Click(object sender, EventArgs e)
{
    button1.BackColor = Color.LimeGreen;
    await Task.Run(() =>
    {
        System.Threading.Thread.Sleep(5000);
        button1.BackColor = Color.DarkGreen;
    });
}

Это превратит вашу кнопку в LimeGreen, затем подождите 5 секунд и верните ее к DarkGreen. Это работает, потому что мы раскручиваем его в новом потоке и, следовательно, не блокируем пользовательский интерфейс.

2 голосов
/ 14 марта 2019

Причина, по которой это не работает, заключается в том, что Thread.Sleep () блокирует завершение потока.

Окно перерисовывается, только когда приложение ничего не делает, т.е. после завершения вашего метода. Если вы удалите строку, где вы изменили ее на DarkGreen, вы увидите, что она изменит цвет через пять секунд.

Вы должны использовать таймер для решения вашей проблемы.

Если вы хотите, вы можете принудительно обновить интерфейс, не выходя из метода с вызовом Application.DoEvents();, который будет отражать сделанные вами изменения, такие как изменение цвета.

    button1.BackColor = Color.Lime;
    Application.DoEvents()
    Thread.Sleep(5000);
    button1.BackColor = Color.DarkGreen;

Обратите внимание, что установка Thread Sleep - это плохая идея в программе с пользовательским интерфейсом, но в целях иллюстрации он покажет вам, как заставить его менять цвет.

0 голосов
/ 14 марта 2019

Я бы не рекомендовал использовать Thread.Sleep (), потому что он заморозит ваш интерфейс.Также вам нужно обновить кнопку, чтобы изменения отображались.Вы можете использовать методы async и wait для отсрочки смены цвета кнопки. Добавьте async после приватного ключевого слова в функции button1_click, создайте функцию Task Async и удалите функцию Thread.Sleep () с помощью await awaiting ();

public partial class Form1 : Form
{
    public Form1()
{
    InitializeComponent();
}

private async void button1_Click(object sender, EventArgs e)
{
    button1.BackColor = Color.Lime;
    button1.Refresh();
    await awaiting();

    button1.BackColor = Color.DarkGreen;
}
private async Task awaiting() {
        await Task.Delay(5000);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...