2010-03-23 2 views
4

Я делаю форму в нижней части экрана, и я хочу, чтобы скользить вверх, так что я написал следующий код:Раздвижные в Winforms форме

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); 
} 

но код просто проходит через и показывает конец положение, не показывая форму, скользящую, в которой я хочу. Я пробовал Refresh, DoEvents - любые мысли?

+1

@rs: Я поставил «Winforms» в названии, чтобы отличить от WPF, и удалить C#, потому что это уже в теге, и не должно быть в названии. Я использовал тег WinForms, потому что это технология, которую вы используете. Вы по какой-то причине возражаете? –

ответ

2

Запустите код в фоновом режиме. Пример:

 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(); 
+0

Работал отлично - спасибо: D –

+0

Это хорошо, но я вижу, что он слишком медленный на старой машине, хотя я установил значение Sleep равным 1. Было бы лучше, если бы у него было общее время для завершения анимации и увеличенной позиции в зависимости от количества пройденного времени. –

6

Попробуйте использовать событие таймера вместо цикла.

+0

Kinda hacky, но я дам ему попробовать :) –

+5

@rs - не хаки, это единственный хороший способ. Я удивлен, что «DoEvents» не работает, но на самом деле это хорошо, потому что «DoEvents» серьезно взломан. –

Смежные вопросы