Цвет кнопки обновляется только ПОСЛЕ завершения метода рисования - PullRequest
0 голосов
/ 17 марта 2019

При использовании Button-Paint-Event кнопка не обновляется на каждой итерации цикла for.Но форма или панель обновляются плавно с каждой итерацией.

Таким образом, при выполнении этого кода кнопка запускается с цветом по умолчанию, затем после завершения цикла for отображает последний цвет в цветах-Array.Он не обновляется при каждой итерации.

Мой вопрос: кто-то знает, почему кнопка не обновляется при каждой итерации, а другие элементы управления используют тот же код?

void Main()
{
    Color[] colors = new Color[10]
    {
        Color.White, Color.Red, Color.Blue, Color.Green, Color.Black,
        Color.Purple, Color.Brown, Color.Yellow, Color.Gray, Color.Lime
    };

    Button button = new Button();
    button.FlatStyle = FlatStyle.Flat;
    button.Paint += (sender, e) =>
    {
        for (int i = 0; i < 10; i++)
        {
            e.Graphics.FillRectangle(
                new SolidBrush(colors[i]),
                new RectangleF(0, 0, button.Width, button.Height));

            Thread.Sleep(100);
            Application.DoEvents();
        }
    };

    Form form = new Form();
    form.Controls.Add(button);
    form.Show();
}

1 Ответ

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

Мой вопрос: кто-то знает, почему кнопка не обновляется при каждой итерации, а другие элементы управления используют тот же код?

Не знаю.

Ваш подход с самого начала несовершенен.Вы никогда не должны Sleep () в основном потоке пользовательского интерфейса, так как это может привести к не отвечающему пользовательскому интерфейсу.Кроме того, вызов DoEvents () может вызвать больше событий Paint () (повторный ввод кода).

Использование элемента управления Timer и изменение значения BackColor * 1012 для кнопки.* оттуда.

Вот простой пример использования Enumerator для многократного циклического переключения цветов:

static void Main()
{
    Color[] colors = new Color[10]
    {
        Color.White, Color.Red, Color.Blue, Color.Green, Color.Black,
        Color.Purple, Color.Brown, Color.Yellow, Color.Gray, Color.Lime
    };
    IEnumerator colorEnum = colors.GetEnumerator();

    Button button = new Button();
    button.FlatStyle = FlatStyle.Flat;

    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
    tmr.Interval = 250;
    tmr.Tick += (s, e) =>
    {
        if (!colorEnum.MoveNext())
        {
            colorEnum.Reset();
            colorEnum.MoveNext();
        }
        button.BackColor = (Color)colorEnum.Current;
    };

    Form form = new Form();
    form.Shown += (s, e) =>
    {
        tmr.Start();
    };
    form.Controls.Add(button);

    Application.Run(form);
}
...