如何解决c#winform-使用计时器为下拉菜单制作动画
|| 我正在尝试在winforms中制作一个动画下拉菜单。发生mouse_enter事件时,表单将扩展;发生mouse_leave事件时,表单将收缩至原始大小。我使用计时器控制“动画”的速率以达到所需的结果。 在运行前几次后,\“ animation \”是根据我想要的,但是经过几次循环(鼠标进入->鼠标移出->鼠标移入->鼠标移出->等)后,动画开始加速直到达到只是简单地快速出现/消失的地步。 是否有其他方法可以达到这种效果或保持所需的动画速率? 顺便说一句,这是我的第一个问题,因此如果我违反任何规则/格式等,请告诉我! private void setForm()
{
this.Location = new Point(Screen.GetWorkingArea(this).Width - this.Width,Screen.GetWorkingArea(this).Height - this.Height);
}
Timer Timer1;
bool mode = false;
private void B00nZPictureBox_MouseEnter(object sender,EventArgs e)
{
mode = true;
Timer1 = new Timer();
Timer1.Interval = 10;
Timer1.Tick += new EventHandler(Timer1_Tick);
Timer1.Start();
}
private void B00nZ_MouseLeave(object sender,EventArgs e)
{
mode = false;
Timer1 = new Timer();
Timer1.Interval = 10;
Timer1.Tick += new EventHandler(Timer1_Tick);
Timer1.Start();
}
void Timer1_Tick(object sender,EventArgs e)
{
int temp = Screen.GetWorkingArea(this).Height;
if (mode)
{
if (this.Height < temp)
{
this.Size = new Size(this.Width,this.Height + 35);
}
else if (this.Height > temp)
{
if (this.Height - temp > 10)
{
this.Size = new Size(this.Width,this.Height - 3);
}
else if (this.Height - temp > 0)
{
this.Size = new Size(this.Width,this.Height - 1);
}
}
else if (this.Height == temp)
{
Timer1.Stop();
Timer1.Dispose();
}
}
else
{
if (this.Height > B00nZPictureBox.Height)
{
this.Size = new Size(this.Width,this.Height - 35);
}
else if (this.Height - B00nZPictureBox.Height <= B00nZPictureBox.Height)
{
this.Size = new Size(this.Width,B00nZPictureBox.Height);
}
if (this.Height == B00nZPictureBox.Height)
{
Timer1.Stop();
Timer1.Dispose();
}
}
setForm();
}
解决方法
根据您要执行的操作,这就是我要执行的操作。首先,创建两个计时器。调用一个enterTimer并调用另一个LeaveTimer。一次连接他们的事件处理程序(在类似于form_load的设置代码中)。还要设置它们的间隔,但不要启动它们。然后,当鼠标进入时,启动enterTimer。当鼠标离开时,启动LeaveTimer。
您可以一直玩直到enterTimer结束,然后再触发LeaveTimer之类的事情,具体取决于您希望的逻辑。您还可以在触发另一个计时器时停止当前正在运行的计时器。
它看起来像这样:
//This would be your FormLoad event or somewhere else where you initialize your form information
private void form_load()
{
enterTimer.Interval = 10;
enterTimer.Tick += new EventHandler(enterTimer_Tick);
leaveTimer.Interval = 10;
leaveTimer.Tick += new EventHandler(leaveTimer_Tick);
}
private void setForm()
{
this.Location = new Point(Screen.GetWorkingArea(this).Width - this.Width,Screen.GetWorkingArea(this).Height - this.Height);
}
Timer enterTimer;
Timer leaveTimer;
private void B00nZPictureBox_MouseEnter(object sender,EventArgs e)
{
enterTimer.Start();
}
private void B00nZ_MouseLeave(object sender,EventArgs e)
{
leaveTimer.Start();
}
void enterTimer_Tick(object sender,EventArgs e)
{
//Put your enter logic here
}
void leaveTimer_Tick(object sender,EventArgs e)
{
//Put your leave logic here
}
, 每次打开菜单时,您都会添加一个EventHandler。计时器关闭后,它将多次执行您的处理程序。
只需添加一次处理程序,或者在每次菜单关闭时将其删除。
, 我建议您在窗体加载时只创建一个Timer,然后将事件处理程序连接一次。此后,您仅应启用和禁用计时器,而无需处置或重新创建它。
现在,如果您在菜单没有完全展开之前进入和离开,最终将泄漏计时器-它已经启动,但是此后全局变量已更改为全新的计时器,因此您无法停止或暂停处置旧的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。