【问题标题】:Simple panel-slider in C#C# 中的简单面板滑块
【发布时间】:2012-07-26 20:24:11
【问题描述】:

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      与其使用Thread.Sleep,不如使用(Winforms)Timer。这将解决 UI 更新问题,并在滑块移动时保持 UI 活动。

      【讨论】:

      • 感谢您的回答,但如何在循环中使用Timer?我的意思是我必须以某种方式暂停循环以产生平滑的幻灯片......也许你可以添加一个剪断的短代码?非常感谢!
      • 计时器替换循环 - 在每个计时器事件上,您移动一步并退出。计时器将按您指定的时间间隔触发,让您的移动与您现在手动执行的延迟一样平滑。
      • Btw Application.DoEvents 工作正常;)只剩下一个问题:面板的大小为 800 像素;如果我将 panel2 移出,我只需将其向左移动 100px。但是,如果我让 panel3 滑入,则有 800px 需要移动。如何确保两张幻灯片以相同的速度完成?我已经将System.Threading.Thread.Sleep(1); 设置为 1,但它仍然比第一个慢...
      • @libjup 请再次阅读我的答案 - 我没有说Application.DoEvents 似乎不起作用,我说这是一个糟糕的解决方案并解释了原因。睡觉不是一件精确的事,分辨率相当粗糙。阅读Sleep (link) 的文档。这可能也很有趣:stackoverflow.com/questions/7614936/…
      • 我明白你在说什么,但我仍然不明白计时器如何知道他的工作何时完成......我的意思是当计数器达到 100 时循环就结束了。但是计时器似乎永远执行他的 eventHandler ?我可以使用一个条件来检查是否到达了面板的最终位置,但计时器仍会每 10 毫秒检查一次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多