我目前正在开发一个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);
}
不知何故,第一块面板完美地滑出,但是面板2没有滑动。它只是在循环执行后显示。
知道为什么panel2没有执行幻灯片吗?我正在使用WinForms。
答案 0 :(得分:1)
尝试在位置更改后在循环体中添加Application.DoEvents
。用户界面需要有机会迎头赶上。
答案 1 :(得分:0)
问题是您不允许通过强制睡眠来运行消息泵。建议的Application.DoEvents
会触发消息泵,但它不是一个好的解决方案,因为您的代码在大多数情况下仍会阻塞,您甚至可能使用此模式在无限循环中运行(例如,如果DoEvents
重新启动进入你正在调用它的事件。
您应该使用(Winforms)Thread.Sleep
而不是Timer
。这将解决UI更新问题,并在滑块移动时保持UI活动。