jma*_*ias 10 aero windows-7 progress-bar
我遇到了我认为是Windows 7上的进度条错误.为了演示该错误,我创建了一个带有按钮和进度条的WinForm应用程序.在按钮的'on-click'句柄中,我有以下代码.
private void buttonGo_Click(object sender, EventArgs e)
{
this.progressBar.Minimum = 0;
this.progressBar.Maximum = 100;
this.buttonGo.Text = "Busy";
this.buttonGo.Update();
for (int i = 0; i <= 100; ++i)
{
this.progressBar.Value = i;
this.Update();
System.Threading.Thread.Sleep(10);
}
this.buttonGo.Text = "Ready";
}
Run Code Online (Sandbox Code Playgroud)
预期的行为是进度条前进到100%,然后按钮文本更改为"就绪".但是,在Windows 7上开发此代码时,我注意到进度条将上升到大约75%,然后按钮文本将变为"就绪".假设代码是同步的,这不应该发生!
在进一步测试中,我发现在Windows Server 2003上运行的完全相同的代码产生了预期的结果.此外,在Windows 7上选择非空气动力学主题会产生预期的结果.
在我看来,这似乎是一个错误.当长操作涉及复杂的代码时,通常很难使进度条准确,但在我的特定情况下它非常直接,所以当我发现进度控制没有准确地表示进度时我感到很失望.
有没有人注意到这种行为?有人找到了解决方法吗?
Foz*_*ozi 19
它与进度条的动画有关.如果您的进度条为0%并且您将其设置为100%,那么它将不会跳到那里,但会使进度条平滑填充动画.如果这太慢,您将在进度条完成动画之前完成.因此即使你已经将其设置为80%,90%和100%,动画仍然落后.
我从来没有找到办法解决这个问题,但我有一个解决方法.只有在增加进度条时才会执行动画.如果向后移动,它会立即跳到该位置.因此,如果我希望进度条位于x%(x!= 100),那么我将其移至x + 1然后移至x.如果我想要它100%,我将它移动到100%,99%和100%.(或者你使用的任何值,你都会得到这个想法.)这个工作得足够快,不会被看到,你也可以将这段代码留给以前的Windows版本(尽管我没有).
小智 5
我有同样的问题。Fozi 的小费对我很有帮助。在设置新值之前,我已设置值 + 1。为了使这项工作也达到 100%,之前必须增加最大值。以下对我来说效果很好。
if (NewValue < progressBar.Maximum)
{
progressBar.Value = NewValue + 1;
progressBar.Value--;
}
else
{
progressBar.Maximum++;
progressBar.Value = progressBar.Maximum;
progressBar.Value--;
progressBar.Maximum--;
}
Run Code Online (Sandbox Code Playgroud)
小智 0
我在 Vista 和 Windows 7 上也看到过类似的进度条问题。
我的案例中的关键问题是 UI 线程的阻塞。(就像您在示例中所做的那样)。
Windows 不喜欢不响应消息队列中新消息的应用程序。如果您在一条消息上花费太多时间,Windows 会将您的应用程序标记为“无响应”。在Vista/Win7中,Windows也决定停止更新您的应用程序窗口。
作为解决方法,您可以将实际工作交给后台工作人员,或者Application.DoEvents()每隔一段时间调用一次。您确实需要确保进度条窗口是模态的,否则 DoEvents() 可能会使新命令在后台处理过程中开始执行。
如果这感觉很混乱,更合适的方法是在线程上完成后台工作BackgroundWorker。它支持向 UI 线程发送事件以更新进度条。
| 归档时间: |
|
| 查看次数: |
4942 次 |
| 最近记录: |