c # медленно меняя цвет кнопки при наведении на нее курсора - PullRequest
0 голосов
/ 11 мая 2019

Поэтому я попытался сделать кнопку более анимированной, сделав так, чтобы при наведении курсора мыши на кнопку ее цвет спины медленно переходил от темно-серого к светло-серому, к сожалению, MouseHover не сработал для меняпотому что мне пришлось использовать его с if (while, do и for вообще не работает), поэтому я изменил его на MouseMove И хорошо, что создавало свои собственные проблемы, прямо сейчас получение цветалегче, только когда я наведу на него мышь, вот код:

    private void BtnPlay_MouseMove(object sender, MouseEventArgs e)
    {
        byte coloDat = btnPlay.FlatAppearance.MouseOverBackColor.B;

        if (btnPlay.FlatAppearance.MouseOverBackColor != Color.FromArgb(68, 68, 68))
        {
            coloDat++;
            btnPlay.FlatAppearance.MouseOverBackColor = Color.FromArgb(coloDat, coloDat, coloDat);
            System.Threading.Thread.Sleep(1);
        }
    }

Я собираюсь использовать код несколько раз в проекте, так есть ли способ сделать это без создания текстовой стены?

Редактировать: во избежание путаницы;я пытаюсь сделать мой проект с Button.FlatAppearance.MouseOverBackColor, а не Button.BackgroundColour.

1 Ответ

0 голосов
/ 12 мая 2019

Если вы хотите создать это в WPF, просто создайте стиль с раскадровкой.В окнах формы вам нужно использовать таймер.

Причина, по которой цикл не работал для вас, заключается в том, что цикл работал в том же потоке, что и пользовательский интерфейс, поэтому пользовательский интерфейс не обновлялся до тех пор, пока цикл не был завершен.Чтобы анимировать эффект в формах Windows, вы должны позволить завершить функцию события, чтобы пользовательский интерфейс мог обновить, а затем снова вызвать вашу функцию для следующего кадра.Это то, что делает элемент таймера.

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

    private Color startColor = Color.AliceBlue;
    private Color endColor = Color.BlueViolet;
    private double step = 0.01;
    private Button lastOver = null;
    private Dictionary<Button, double> transitionProgress = new Dictionary<Button, double>();

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

    private void demoButton_MouseHover(object sender, EventArgs e)
    {
        if (sender != lastOver)
        {
            lastOver = (Button)sender;
            if (!transitionProgress.ContainsKey(lastOver))
            {
                transitionProgress[lastOver] = 0.0;
            }
        }
    }

    private void demoButton_MouseLeave(object sender, EventArgs e)
    {
        lastOver = null;
    }

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

    private void styleUpdate_Tick(object sender, EventArgs e)
    {
        for (int i = 0; i < transitionProgress.Count; i++)
        {
            Button button = transitionProgress.Keys.ElementAt(i);
            bool changing = false;
            if (button == lastOver)
            {
                if (transitionProgress[button] < 1.0)
                {
                    transitionProgress[button] = Math.Min(1.0, transitionProgress[button] + step);
                    changing = true;
                }
            }
            else
            {
                if (transitionProgress[button] > 0.0)
                {
                    transitionProgress[button] = Math.Max(0.0, transitionProgress[button] - step);
                    changing = true;
                }
            }
            if (changing)
            {
                double progress = transitionProgress[button];
                button.BackColor = Color.FromArgb(
                    (int)Math.Floor((endColor.R - startColor.R) * progress + startColor.R),
                    (int)Math.Floor((endColor.G - startColor.G) * progress + startColor.G),
                    (int)Math.Floor((endColor.B - startColor.B) * progress + startColor.B)
                    );
            }
        }
    }

Таймер должен быть включен и установлен интервал 16

        this.styleUpdate.Enabled = true;
        this.styleUpdate.Interval = 16;
        this.styleUpdate.Tick += new System.EventHandler(this.styleUpdate_Tick);

Это похоже намного кода, но чтобы добавить его к другой кнопке, вам просто нужно еще две строки кода.

        this.yourButtonName.MouseLeave += new System.EventHandler(this.demoButton_MouseLeave);
        this.yourButtonName.MouseHover += new System.EventHandler(this.demoButton_MouseHover);
...