我想学习.NET
编程。 作为我学习的一部分,我试图让上的按钮有一定的影响。 它的工作...但并不像我想象的那样顺利! 有没有更好的方式来做到这一点? 先感谢您!
我的需要:
有3个按钮。 当你将鼠标悬停在其中的一个,它扩展,当你鼠标移出从该按钮,返回到其初始大小。
private void button1_MouseHover(object sender, EventArgs e)
{
button1.BackColor = Color.White;
button1.Width = 130;
button1.BringToFront();
}
private void button1_MouseLeave(object sender, EventArgs e)
{
button1.BackColor = Color.Red;
button1.Width = 75;
}
private void button2_MouseHover(object sender, EventArgs e)
{
button2.BackColor = Color.Gray;
button2.Width = 130;
button2.BringToFront();
}
private void Form1_MouseLeave(object sender, EventArgs e)
{
button2.BackColor = Color.Red;
button2.Width = 75;
}
private void button3_MouseHover(object sender, EventArgs e)
{
button3.BackColor = Color.DimGray;
button3.Width = 130;
button3.BringToFront();
}
private void button3_MouseLeave(object sender, EventArgs e)
{
button3.BackColor = Color.Red;
button3.Width = 75;
}
所以第一关,你不想做的事是完全相同的3倍。 创建一个单一的方法来添加适当的处理程序按钮,然后只写一次代码来处理任何给定的按钮。
请注意,您可以进入扩张/收缩蜱处理程序和使用percentComplete
值来设置高度为好,根据频谱移动颜色(这将涉及的颜色却有些数学做虽然)或改变的任何其他方面按钮。 如果你真的动机概括它,你可以添加参数的方法Action<double>
文件做一些事来基于给定的百分比进度的对象。
public void AddAnimation(Button button)
{
var expandTimer = new System.Windows.Forms.Timer();
var contractTimer = new System.Windows.Forms.Timer();
expandTimer.Interval = 10;//can adjust to determine the refresh rate
contractTimer.Interval = 10;
DateTime animationStarted = DateTime.Now;
//TODO update as appropriate or make it a parameter
TimeSpan animationDuration = TimeSpan.FromMilliseconds(250);
int initialWidth = 75;
int endWidth = 130;
button.MouseHover += (_, args) =>
{
contractTimer.Stop();
expandTimer.Start();
animationStarted = DateTime.Now;
button.BackColor = Color.DimGray;
};
button.MouseLeave += (_, args) =>
{
expandTimer.Stop();
contractTimer.Start();
animationStarted = DateTime.Now;
button.BackColor = Color.Red;
};
expandTimer.Tick += (_, args) =>
{
double percentComplete = (DateTime.Now - animationStarted).Ticks
/ (double)animationDuration.Ticks;
if (percentComplete >= 1)
{
expandTimer.Stop();
}
else
{
button.Width = (int)(initialWidth +
(endWidth - initialWidth) * percentComplete);
}
};
contractTimer.Tick += (_, args) =>
{
double percentComplete = (DateTime.Now - animationStarted).Ticks
/ (double)animationDuration.Ticks;
if (percentComplete >= 1)
{
contractTimer.Stop();
}
else
{
button.Width = (int)(endWidth -
(endWidth - initialWidth) * percentComplete);
}
};
}
如果您使用的WinForms,动画将是相当痛苦的,你将不得不通过自己处理他们Timer
对象。
如果你正在为.NET和想和animatons和造型看起来很酷的应用,我强烈建议你在WPF看看吧。 它可以做的动画非常容易,虽然C#或XAML。
虽然它仍然有可能在的WinForms,它会在那里为这些功能被内置到WPF已经(和优化)远远更多的开发时间。
当您修改控件的属性,它生效瞬间。 你的愿望是什么,通常被称为某种类型的褪色或渐变的。 有可能是图书馆在那里要做到这一点,但如果你想这样写自己的乐趣,你可以使用一个Timer对象,并在每个tick更新的颜色。
你会怎样做的是设置一种颜色作为TargetColor地方(这是一个变量或属性你补),然后启动蜱可能每10毫秒的定时器。 在每一跳,你看的开始时间,从那以后多长时间已经过去了。 如果你希望动画发生一整秒的,然后就是1000毫秒。 所以,每个刻度时,你看看那已经过去了,也许200毫秒的时间量,然后除以200/1000得到的,你已经进入了动画时间的分数。 然后,你看看启动和目标色之间的差异,乘以分数这种差异,并将结果添加到起始色。 换句话说,200毫秒到动画持续1000毫秒,意味着你有20%到动画。 因此,你要设置的颜色是什么颜色是接近尾声的颜色开始颜色20%。
有很多,你可以做些什么来改进这一点。 也许有一个封装了计时器,并公开功能/性能跟踪开始/结束的颜色,动画过渡时间等子类Button控件最有动感的UI功能,这样让你指定的动画应该持续多长时间,然后把它插在其间指出,因为它过渡。 这是长期渐变的来源,因为它来自通过inbetweening从一种状态过渡到另一种