Search code examples
c#timerthread-sleep

How do I autohide a form


I have a very simple question i guess...for which i am not able to find an answer for. I am trying to add an autohide feature for a borderless WinForm which is located at (0,0) with a width of 150. I have the following code:

    private int dx;

    private void autohide()
    {
        for (dx = 0; dx > -150; dx--)
        {
            this.Width = dx;
            Thread.Sleep(2);
        }
    }

Even after, using Thread.Sleep(x), the Form just snaps off to final Width without giving/having any effect of delay. I am trying to put a bit of effect on to it .

Please help...


Solution

  • The issue you are facing is because the window is not re-drawing itself at any point because your code doesn't exit the autohide() routine until dx is 150, so it will just have a delay before re-drawing in the final position.

    You probably also want to change the position rather than the width.

    The better option would be to start up a Timer which then changes the position each time it fires, which would cause the change to be animated:

        private Timer t;
        private int step = 1;
    
        private void autohide()
        {
            t = new Timer();
            t.Interval = 2;
            t.Tick += T_Tick;
            t.Start();
        }
    
        private void T_Tick(object sender, EventArgs e)
        {
            if (this.Location.X > 0 - this.Width)
            {
                this.Location = new Point(this.Location.X - step, this.Location.Y);
            }
            else
            {
                t.Stop();
            }
        }