0

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

4

2 回答 2

1

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

于 2012-07-26T20:30:15.473 回答
0

问题是您不允许通过强制睡眠来运行消息泵。建议Application.DoEvents触发消息泵,但这不是一个好的解决方案,因为您的代码大部分时间仍然阻塞,您甚至可能以这种模式在无限循环中运行(例如,如果DoEvents重新输入您从中调用它的事件) .

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

于 2012-07-26T20:31:38.610 回答