C#中的简单面板滑块

时间:2012-07-26 20:24:12

标签: c# winforms

我目前正在开发一个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。

2 个答案:

答案 0 :(得分:1)

尝试在位置更改后在循环体中添加Application.DoEvents。用户界面需要有机会迎头赶上。

答案 1 :(得分:0)

问题是您不允许通过强制睡眠来运行消息泵。建议的Application.DoEvents会触发消息泵,但它不是一个好的解决方案,因为您的代码在大多数情况下仍会阻塞,您甚至可能使用此模式在无限循环中运行(例如,如果DoEvents重新启动进入你正在调用它的事件。

您应该使用(Winforms)Thread.Sleep而不是Timer。这将解决UI更新问题,并在滑块移动时保持UI活动。