Создание затухающей метки - PullRequest
5 голосов
/ 29 марта 2011

Это может показаться простым вопросом ...

Я ищу свойство Label.Opacity в C # Winforms.

То, что я хочу сделать, - это метод, который постепенно исчезает с ярлыка.Возможно, с помощью таймера?

Так как нет непрозрачности, я пытаюсь установить ее прозрачность на более высокие числа, пока она не станет достаточно высокой, чтобы элемент стал невидимым.Но я не могу заставить это работать.

В настоящее время у меня есть:

public FadeLabel()
{
    MyTimer timer = new MyTimer();
    this.TextChanged += (s, ea) =>
    {
        if (timer.IsActive)
        {
            timer.Reset();
        }
        else
        {
            timer.WaitTime.Miliseconds = 500;
            timer.Start();
            timer.Completed += (a) =>
            {
                int i = 0;
                Timer tm = new Timer();
                tm.Interval = 1;
                tm.Tick += (sa, aea) =>
                {
                    i++;
                    this.ForeColor = Color.FromArgb(i, Color.Black);
                    this.BackColor = Color.FromArgb(i, Color.White);
                    this.Invalidate();
                    if (i == 255)
                    {
                        tm.Stop();
                    }
                };
                tm.Start();
            };
        }
    };
}

Ответы [ 4 ]

8 голосов
/ 04 августа 2013

Это то, что я использую для затухания меток:

    label1.Text = "I'm fading out now";
    label1.ForeColor = Color.Black;
    timer1.Start();

    private void timer1_Tick(object sender, EventArgs e)
    {
        int fadingSpeed = 3;
        label1.ForeColor = Color.FromArgb(label1.ForeColor.R + fadingSpeed, label1.ForeColor.G + fadingSpeed, label1.ForeColor.B + fadingSpeed);

        if (label1.ForeColor.R >= this.BackColor.R)
        {
            timer1.Stop();
            label1.ForeColor = this.BackColor;
        }
    }

Возможно, не лучшее решение, но я все еще новичок, поэтому я могу внести свой вклад. Я поставил timer1.Interval на минимум и играл с fadingSpeed, пока он не выглядел хорошо.

4 голосов
/ 16 декабря 2013

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

private void timer1_Tick(object sender, EventArgs e)
    {
        // timer interval set to 10 to ensure smooth fading
        // declared int: r = 0, g = 215 and b = 180
        // target values are r = 32, g = 32 and b = 32 to match BackColor
        fade++;
        if (fade >= 500) // arbitrary duration set prior to initiating fade
        {
            if (r < 32) r++; // increase r value with each tick
            if (g > 32) g--; // decrease g value with each tick
            if (b > 32) b--; // decrease b value with each tick
            label1.ForeColor = Color.FromArgb(255, r, g, b);
            if (r == 32 && g == 32 && b == 32) // arrived at target values
            {
                // fade is complete - reset variables for next fade operation
                label1.ForeColor = Color.FromArgb(255, 0, 215, 180);
                label1.Text = "";
                fade = 0;
                r = 0;
                g = 215;
                b = 180;
                timer1.Enabled = false;
            }
        }
    }
2 голосов
/ 29 марта 2011

Ваш таймер блокирует поток пользовательского интерфейса?Если это так, вы ничего не увидите, пока не пройдет.Быстрый способ исправить ситуацию - позвонить Application.DoEvents вместо this.Invalidate();.

1 голос
/ 19 февраля 2014

Это более полное и элегантное решение:

// Aufruf der Methode aus dem Worker-Thread
private void OnFadeTimerEvent(object sender, ElapsedEventArgs e)
{
    this.Invoke(new Action(() => FadeOutLabel()));
}

private void FadeOutLabel()
{
    if (labelStartHelp.ForeColor.GetBrightness() <= 0.01)
    {
        FadeTimer.Enabled = false;
        labelStartHelp.Visible = false;
        return;
    }
    HslColor hsl = new HslColor(labelStartHelp.ForeColor);
    hsl.L -= 0.002; // Brightness is here lightness
    labelStartHelp.ForeColor = (System.Drawing.Color)hsl.ToRgbColor();
}

с использованием класса APCyotek HslColor: http://cyotek.com/downloads/view/Cyotek.Windows.Forms.ColorPicker.zip/Cyotek.Windows.Forms.ColorPicker/Cyotek.Windows.Forms.ColorPicker/HslColor.cs

не знаю о лицензии. Надеюсь, тебе понравится!

...