Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sliding in Winforms form

Tags:

c#

loops

winforms

I'm making a form at the bottom of the screen and I want it to slide upwards so I wrote the following code:

int destinationX = (Screen.PrimaryScreen.WorkingArea.Width / 2) - (this.Width / 2);
int destinationY = Screen.PrimaryScreen.WorkingArea.Height - this.Height;

this.Location = new Point(destinationX, destinationY + this.Height);

while (this.Location != new Point(destinationX, destinationY))
{
    this.Location = new Point(destinationX, this.Location.Y - 1);
    System.Threading.Thread.Sleep(100);
}

but the code just runs through and shows the end position without showing the form sliding in which is what I want. I've tried Refresh, DoEvents - any thoughts?

like image 298
rs. Avatar asked Jan 22 '23 09:01

rs.


2 Answers

Try using a Timer event instead of a loop.

like image 115
David Avatar answered Feb 02 '23 10:02

David


Run the code in a background thread. Example:

        int destinationX = (Screen.PrimaryScreen.WorkingArea.Width / 2) - (this.Width / 2);
        int destinationY = Screen.PrimaryScreen.WorkingArea.Height - this.Height;

        Point newLocation = new Point(destinationX, destinationY + this.Height);

        new Thread(new ThreadStart(() =>
        {
            do
            {
                 // this line needs to be executed in the UI thread, hence we use Invoke
                this.Invoke(new Action(() => { this.Location = newLocation; }));

                newLocation = new Point(destinationX, newLocation.Y - 1);
                Thread.Sleep(100);
            }
            while (newLocation != new Point(destinationX, destinationY));
        })).Start();
like image 36
Heinzi Avatar answered Feb 02 '23 12:02

Heinzi