これで、WinForm 上のコントロールをアニメーション化してから、残りのコード ブロックの後続の操作を再開するプログラムができました。これがサンプルコードです。
関数はおそらくメインスレッドで実行されているWinFormにあります
Private void DoThisWork();
{
do some work here
animateControls()
//<NEED TO PAUSE HERE WHILE THE GUI ANIMATES AND UPDATES DISPLAYING THE ANIMATION OF THE CONTROL>
//Tried Option 1: thread.sleep. When we do this the main thread blocks and the animation is //not seen. The control is directly painted at x1,y1 and thats it, the intermediate rendering is not seen
// Tried Option 2: Application.DoEvents. This works very well except that the CPU maxes out and the animation then appears very jittery
continue doing remaining work // must execute only after animateControls() completes the animation part.
}
さて、これanimateControls()
は単にタイマー上の関数であり、コントロールをポイント (x,y) から (x1,y1) に移動します。これには約 3 秒かかります。
SuspendLayout と ResumeLayout は GUI の更新を強制しません。これは、thread.sleep によってメイン スレッドがブロックされ、すべてが事実上停止しているためです。
別のスレッドを使用して GUI をアニメーション化しても、アニメーション全体を完了する必要があるため、役に立たないようです。
また、アニメーションコードは複数の関数から呼び出され、共通関数として使用されるため、何も追加できません。