这似乎是一个简单的问题......
我正在寻找C#Winforms中的Label.Opacity属性。
我希望做的是逐渐淡化标签的方法。通过计时器或许?
由于没有Opacity,我试图将它的transperency设置为更高的数字,直到它足够高以至于该项目应该是不可见的。但我似乎无法做到这一点。
目前我有:
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();
};
}
};
}
答案 0 :(得分:8)
这就是我用来淡出标签的原因:
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
一起玩,直至看起来不错。
答案 1 :(得分:4)
我发现创建平滑淡入淡出的一种方法是使用计时器调整ForeColor RGB变量。这使您可以控制持续时间,并允许您精细化从当前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 :(得分:2)
您的计时器是否阻止了UI线程?如果是这样,在它过去之后你将看不到任何东西。解决问题的快捷方法是拨打Application.DoEvents
而不是this.Invalidate();
。
答案 3 :(得分:1)
这是一个更完整和更优雅的解决方案:
// 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
但是,不知道许可证。希望你喜欢它!答案 4 :(得分:1)
这就是我写的。它还可以处理不同颜色(例如绿色,红色)的标签
实例该类,可随时将其粘贴到标签上。设置消息和初始前景色后,请调用setColorSteps以及所需的步骤。
要运行渐变时,请调用doFade()
为OP提供计时器循环事件,这是我在编写此解决方案时使用的,该解决方案可以满足我的需要。
/// <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);
}
}