创建淡出标签

发布于 2024-10-27 19:30:11 字数 1090 浏览 4 评论 0原文

这似乎是一个简单的问题...

我正在寻找 C# Winforms 中的 Label.Opacity 属性。

我想做的是有一种方法可以逐渐淡出标签。也许通过计时器?

由于没有不透明度,我尝试将其透明度设置为更高的数字,直到它足够高以使该项目不可见。但我似乎无法完成这项工作。

目前我有:

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();
            };
        }
    };
}

This might seem like a simple question...

I'm looking for the Label.Opacity property in C# Winforms.

What I wish to do is have a method that fade's out a label gradually. By means of a timer perhaps?

Since there is not Opacity I'm trying to set it's transperency to higher numbers untill it's high enough that the item should be invisible. But I can't seem to make this work.

Currently I have:

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();
            };
        }
    };
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

死开点丶别碍眼 2024-11-03 19:30:11

这就是我用来淡出标签的方法:

    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 进行播放,直到看起来不错为止。

This is what I'm using to fade out labels:

    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;
        }
    }

Maybe not the best solution but I'm still a beginner so this is what I can contribute with. I put timer1.Interval at minimum and played with fadingSpeed until it looked good.

彻夜缠绵 2024-11-03 19:30:11

我发现创建平滑淡入淡出效果的一种方法是使用计时器调整 ForeColor RGB 变量。这使您可以控制持续时间,并允许您巧妙地从当前前景色值到目标值的过渡。

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;
            }
        }
    }

One way that I've found to create a smooth fade is to adjust the ForeColor RGB variables using a timer. This gives you control over the duration and allows you to finesse the transition from current ForeColor values to the target values.

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;
            }
        }
    }
递刀给你 2024-11-03 19:30:11

你的计时器会阻塞 UI 线程吗?如果是这样,直到它过去之后你才会看到任何东西。解决问题的快速方法是调用 < code>Application.DoEvents 而不是 this.Invalidate();

Does your timer block the UI thread? If so, you won't see anything until after it elapses. A quick way to fix things will be to call Application.DoEvents instead of this.Invalidate();.

殊姿 2024-11-03 19:30:11

这是一个更完整和优雅的解决方案:

// 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

但不知道许可证。希望你喜欢它!

This is a more complete and elegant solution:

// 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();
}

using APCyotek HslColor class: http://cyotek.com/downloads/view/Cyotek.Windows.Forms.ColorPicker.zip/Cyotek.Windows.Forms.ColorPicker/Cyotek.Windows.Forms.ColorPicker/HslColor.cs

dont know about license though. Hope u like it!

不即不离 2024-11-03 19:30:11

这是我写的。它还处理不同颜色的标签(例如绿色、红色)

实例化类,随时附加到标签。设置消息和初始前景色后,调用 setColorSteps 并确定所需的步数。

当您想要运行淡入淡出时,请

为计时器循环事件调用 OP 的 doFade() Props,我在编写适合我需要的解决方案时使用了它。

/// <summary>
/// Fade a label - Derek Piper 2019
/// </summary>
public class LabelFader
{
    Label label;
    List<ColorStep> colorSteps = new List<ColorStep>();

    public void attachToControl(Label useLabel)
    {
        this.label = useLabel;
    }

    public void setColorSteps(int numSteps)
    {
        if (this.label != null)
        {
            ColorStep start = new ColorStep(this.label.ForeColor);
            ColorStep end = new ColorStep(this.label.BackColor);
            int redIncrement = ((end.R - start.R) / numSteps);
            int greenIncrement = ((end.G - start.G) / numSteps);
            int blueIncrement = ((end.B - start.B) / numSteps);
            this.colorSteps = new List<ColorStep>();
            for (int i = 0; i <= numSteps; i++)
            {
                ColorStep newStep = new ColorStep();
                if (redIncrement > 0)
                {
                    newStep.R = start.R + (i * redIncrement);
                }
                else
                {
                    newStep.R = start.R - (i * redIncrement);
                }
                if (greenIncrement > 0)
                {
                    newStep.G = start.G + (i * greenIncrement);
                }
                else
                {
                    newStep.G = start.G - (i * greenIncrement);
                }
                if (blueIncrement > 0)
                {
                    newStep.B = start.B + (i * blueIncrement);
                }
                else
                {
                    newStep.B = start.B - (i * blueIncrement);
                }
                this.colorSteps.Add(newStep);
            }
        }
    }

    public void doFade(int speedMs = 40)
    {
        Timer tm = new Timer();
        tm.Interval = speedMs;
        int step = 0;
        int end = this.colorSteps.Count;
        if (this.colorSteps.Count > 0)
        {
            tm.Tick += (sa, aea) =>
            {
                ColorStep thisStep = this.colorSteps[step];
                this.label.ForeColor = Color.FromArgb(thisStep.R, thisStep.G, thisStep.B);
                step++;
                if (step >= end)
                {
                    tm.Stop();
                    this.label.Visible = false;
                }
            };
            tm.Start();
        }
    }
}

class ColorStep
{
    public int R = 0;
    public int G = 0;
    public int B = 0;

    public ColorStep()
    {
    }

    public ColorStep(Color from)
    {
        this.setFromColor(from);
    }

    public void setFromColor(Color from)
    {
        this.R = from.R;
        this.G = from.G;
        this.B = from.B;
    }

    public Color getColor()
    {
        return Color.FromArgb(this.R, this.G, this.B);
    }
}

Here's what I wrote. It also handles labels of different colors (e.g. green, red)

Instance the class, attach to the label any time. After you set the message and the initial foreground color, then call setColorSteps and how many steps you want.

When you want to run the fade, call doFade()

Props to OP for the timer loop event, which I used when I wrote this solution that worked for what I needed.

/// <summary>
/// Fade a label - Derek Piper 2019
/// </summary>
public class LabelFader
{
    Label label;
    List<ColorStep> colorSteps = new List<ColorStep>();

    public void attachToControl(Label useLabel)
    {
        this.label = useLabel;
    }

    public void setColorSteps(int numSteps)
    {
        if (this.label != null)
        {
            ColorStep start = new ColorStep(this.label.ForeColor);
            ColorStep end = new ColorStep(this.label.BackColor);
            int redIncrement = ((end.R - start.R) / numSteps);
            int greenIncrement = ((end.G - start.G) / numSteps);
            int blueIncrement = ((end.B - start.B) / numSteps);
            this.colorSteps = new List<ColorStep>();
            for (int i = 0; i <= numSteps; i++)
            {
                ColorStep newStep = new ColorStep();
                if (redIncrement > 0)
                {
                    newStep.R = start.R + (i * redIncrement);
                }
                else
                {
                    newStep.R = start.R - (i * redIncrement);
                }
                if (greenIncrement > 0)
                {
                    newStep.G = start.G + (i * greenIncrement);
                }
                else
                {
                    newStep.G = start.G - (i * greenIncrement);
                }
                if (blueIncrement > 0)
                {
                    newStep.B = start.B + (i * blueIncrement);
                }
                else
                {
                    newStep.B = start.B - (i * blueIncrement);
                }
                this.colorSteps.Add(newStep);
            }
        }
    }

    public void doFade(int speedMs = 40)
    {
        Timer tm = new Timer();
        tm.Interval = speedMs;
        int step = 0;
        int end = this.colorSteps.Count;
        if (this.colorSteps.Count > 0)
        {
            tm.Tick += (sa, aea) =>
            {
                ColorStep thisStep = this.colorSteps[step];
                this.label.ForeColor = Color.FromArgb(thisStep.R, thisStep.G, thisStep.B);
                step++;
                if (step >= end)
                {
                    tm.Stop();
                    this.label.Visible = false;
                }
            };
            tm.Start();
        }
    }
}

class ColorStep
{
    public int R = 0;
    public int G = 0;
    public int B = 0;

    public ColorStep()
    {
    }

    public ColorStep(Color from)
    {
        this.setFromColor(from);
    }

    public void setFromColor(Color from)
    {
        this.R = from.R;
        this.G = from.G;
        this.B = from.B;
    }

    public Color getColor()
    {
        return Color.FromArgb(this.R, this.G, this.B);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文