2012-07-26 52 views
0

我目前正在開發一個C#應用程序。現在我試圖實現一個簡單的滑塊:C#中的簡單面板滑塊#

|--------------------------| 
|       | 
| |--------------------| | 
| |     | | 
| |  Panel1  | | 
| |  Panel2  | | 
| |     | | 
| |--------------------| | 
|   x x x   | 
|--------------------------| 

我有兩個大小完全相同的面板。 Panel1僅用於顯示邊界併爲panel2設置邊界,然後動態交換該邊界。

如果第二個x被點擊,panel2應該移動到左側,panel3應該從右側移動到左側。

基本上我有以下代碼:

Panel panel2 = panelArray[0]; 
Panel panel3 = panelArray[1]; 

下面的代碼現在應該執行幻燈片:

for (int i = 0; i <= 100; i++) 
{ 
    panel2.Location = new Point(panel2.Location.X - i, panel2.Location.Y); 
    System.Threading.Thread.Sleep(10); 
} 

for (int i = 0; i <= 100; i++) 
{ 
    panel3.Location = new Point(100 - i, panel3.Location.Y); 
    System.Threading.Thread.Sleep(10); 
} 

不知何故所述第一面板滑動出完美,但是Panel2不滑動。它只是在循環執行後顯示。

任何想法爲什麼panel2沒有執行幻燈片?我正在使用WinForms。

回答

1

嘗試在位置更改後在您的循環體中添加Application.DoEvents。用戶界面需要一個追趕的機會。

0

問題是,您不允許通過強制睡眠來運行消息泵。建議的Application.DoEvents會觸發消息泵,但這不是一個好的解決方案,因爲您的代碼大部分時間都會阻塞,甚至可能會以此模式運行在無限循環中(例如,如果DoEvents重新輸入了您要調用的事件從)。

而不是使用Thread.Sleep你應該使用(Winforms)Timer。這將解決UI更新問題,並在滑塊移動的同時保持UI的活躍狀態。

+0

感謝您的回答,但我如何在循環中使用'Timer'?我的意思是我不知何故必須暫停循環來產生一個平滑的幻燈片...也許你可以添加一個簡短的代碼剪輯?非常感謝! – libjup 2012-07-26 20:42:13

+0

該計時器替換循環 - 在您移動一步後退出的每個計時器事件上。計時器將會按照您指定的時間間隔觸發,讓您的移動速度與您現在手動進行的延遲一樣平滑。 – Lucero 2012-07-26 20:45:11

+0

Btw Application.DoEvents工作正常;)只剩下一個問題:面板的大小爲800px;如果我將panel2移出,我只需將它移動到左邊100px。但是,如果我讓panel3滑動有800px被移動。我如何確保兩張幻燈片都以相同的速度完成?我已經設置了'System.Threading.Thread.Sleep(1);'爲1,但它仍然比第一個稍慢... – libjup 2012-07-26 20:46:03