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,然后将事件处理程序连接一次。此后,您仅应启用和禁用计时器,而无需处置或重新创建它。 现在,如果您在菜单没有完全展开之前进入和离开,最终将泄漏计时器-它已经启动,但是此后全局变量已更改为全新的计时器,因此您无法停止或暂停处置旧的。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...