您可以使用您的代碼,但您需要強制UI線程更新您修改的位圖。爲此該行添加到您的Foo
:
panel1.Refresh();
這是假設你寫顯示位圖屬性直接(見下文!)。當然,您需要將panel1
更改爲包含Bitmap
的控件;參見下面用於使用外部Bitmap
變量或「內部」Image
(對於PictureBox
)或BackgroundImage
(對於Panel
或許多其他的)特性的控制的兩個基本情況!
相反,如果你想在一個位圖工作變量您Foo
看起來是這樣的:
public void Foo()
{
Bitmap bmp = (Bitmap) panel1.BackgroundImage;
// now do your drawing stuff
bmp.SetPixel(...);
panel1.BackgroundImage = bmp;
panel1.Refresh();
}
雖然這會工作,動畫的方式通常做的是通過使用Timer
。
在使用Timer
將打破循環的關鍵:
移動的設定最多,也許Button.Click
,其餘移到Timer.Tick
,也許是這樣的:現在
計數器在類級別:
int counter = 0;
的Tick
保持計數,檢查和繪圖體:
private void timer1_Tick(object sender, EventArgs e)
{
if (counter > 1000)
{
timer1.Stop();
}
else
{
angle1 += angle1Modifier;
angle2 += angle2Modifier;
angle3 += angle3Modifier;
DrawPixel(getPoint(angle1, angle2, angle3));
yourCanvasControl.Refresh();
}
}
的Click
保存設置並啓動循環/定時器:
private void buttonStart_Click(object sender, EventArgs e)
{
counter = 0;
timer1.Interval = 50;
timer1.Start();
}
這工作,因爲Timer
與「UI線程」相關聯,這是一個線程完成所有的工作顯示爲以及接受所有的用戶輸入。
顯然,你不應該阻止它,否則你的程序變得緩慢或似乎凍結,但一個Timer
,而不是一個Thread.Sleep
不會阻塞UI線程,所以它是動畫(一個不錯的選擇,只要他們進入Winforms)。
注:由於您使用的是SetPixel
要修改Bitmap
,你將需要對持有Bitmap
到Tick
使其顯示控件添加一個Invalidate()
或Refresh()
;讓我們來看看如何做到這一點:
如果您正在修改外部Bitmap bmp
你需要重新分配它:
bmp.SetPixel(...);
panel1.BackgroundImage = bmp;
如果不是您的modfying的Image
或BackgroundImage
直接在Refresh
的Invalidate
會做:
((Bitmap)panel1.BackgroundImage).SetPixel(...);
panel1.Invalidate();
來源
2015-10-17 06:20:17
TaW
嘗試等待/異步,計時器,手動測量日期時間,什麼都沒有。 Thread.Sleep顯然沒有做任何事情。人們總是說「不要屏蔽UI線程」 - 這甚至意味着什麼?這就是要點,我想推遲UI的展示。 –
請發佈一個最小的,完整的問題重現。目前,我們沒有足夠的信息來幫助。 –
查看我的更新回答如何在winforms中做一個緩慢的動畫。 – TaW