在WinForm中許多控件(本文以最常用的PictureBox為例)都有Image屬性,如果該Image是一個動畫Gif的話,它會自動運行動畫。在某些場合,我們希望控制該動畫的啟停,此時我們首先想到了ImageAnimator,但實際使用時,我們發現以下指令根本不起作用,Gif停不下來,具體原因不明:

ImageAnimator.StopAnimate(box.Image, new EventHandler(OnImageAnimate));

private void OnImageAnimate(Object sender, EventArgs e)


{

this.Invalidate();

}

此時,我想到控件的Enable屬性,在其為false時,Gif是不會啟動的,一旦設其為true,則動畫立刻自動運行,因此只要該屬性不作它用,則完全可以用來控制動畫的啟停。
需要注意的是線程的安全性,以下代碼示例實現了某一控件點擊後啟動Gif運行5秒鐘,然後停下來:

delegate void SetGifEnableCallback(Control control, bool enable);


void picboxSearching_Click(object sender, EventArgs e)


{

Thread t = new Thread(new ThreadStart(Animate));

t.Start();

}


private void SetGifEnable(Control control, bool enable)


{

if (control.InvokeRequired)

{

SetGifEnableCallback callback = new SetGifEnableCallback(SetGifEnable);


this.Invoke(callback, new object[]

{ control, enable });

}

else control.Enabled = enable;

}


private void Animate()


{

PictureBox box = this.pictureBox1;

AutoResetEvent waitHandler = new AutoResetEvent(false);

SetGifEnable(box, true);

waitHandler.WaitOne(5000, true);

SetGifEnable(box, false);

}