2012-07-26 72 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