我遇到了我认为是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上选择非空气动力学主题会产生预期的结果.
在我看来,这似乎是一个错误.当长操作涉及复杂的代码时,通常很难使进度条准确,但在我的特定情况下它非常直接,所以当我发现进度控制没有准确地表示进度时我感到很失望.
有没有人注意到这种行为?有人找到了解决方法吗?
在Vista/7中,Windows资源管理器外壳窗口使用一种特殊的静态进度条来显示硬盘空间.
使用默认样式时,此栏为蓝色且未设置动画.当它接近满(低磁盘空间)时,它也会变成红色.
使用消息传递,我可以告诉Windows Forms ProgressBar控件将其状态更新为Paused和Error(分别为黄色和红色),这样可以正常工作,但这些仍然是特定于进度的.
在Windows用户体验指南中,它特别指出了进度条的这个"米"变体:
此模式不是进度条,但它是使用进度条控件实现的.仪表具有独特的外观,可以将它们与真正的进度条区分开来.
他们说它"是使用进度条控件实现的",所以......怎么样?我可以向控件发送什么消息让它以这种方式运行?
我已经看到你可以发送用于设置条形颜色的消息,但文档说在启用视觉样式时会忽略这些调用.原始ProgressBar控件的Windows API文档中没有任何其他内容似乎提示了一种方法.我只是坚持制作一个自定义绘制栏?我真的很想尽可能利用操作系统,以便应用程序在不同的操作系统版本中显得一致.我意识到Vista之前的版本可能不会支持这一点.
我正在寻找一个Windows窗体的解决方案,但我不知道,如果它甚至暴露在所有通过的Win32 API.
我正在使用进度条向用户显示该过程的进度.它有17个步骤,根据天气情况可能需要大约5秒到2到3分钟(好吧,数据库)
我在XP中没有遇到任何问题,进度条没问题,但是在vista中进行测试时我发现情况已经不再如此.
例如:如果它接近5秒,它可能会在消失之前使其成为1/3,因为它已经完成.虽然它的进展是17的17,但它没有显示出来.我相信这是因为动画Vista强加于进度条并且动画无法快速完成.
有谁知道我怎么纠正这个?
这是代码:
这是更新进度条的部分,等待是具有进度条的表单.
int progress = 1;
//1 Cash Receipt Items
waiting.setProgress(progress, 18, progress, "Cash Receipt Items");
tblCashReceiptsApplyToTableAdapter1.Fill(rentalEaseDataSet1.tblCashReceiptsApplyTo);
progress++;
//2 Cash Receipts
waiting.setProgress(progress, "Cash Receipts");
tblCashReceiptsTableAdapter1.Fill(rentalEaseDataSet1.tblCashReceipts);
progress++;
//3 Checkbook Codes
waiting.setProgress(progress, "Checkbook Codes");
tblCheckbookCodeTableAdapter1.Fill(rentalEaseDataSet1.tblCheckbookCode);
progress++;
//4 Checkbook Entries
waiting.setProgress(progress, "Checkbook Entries");
tblCheckbookEntryTableAdapter1.Fill(rentalEaseDataSet1.tblCheckbookEntry);
progress++;
//5 Checkbooks
waiting.setProgress(progress, "Checkbooks");
tblCheckbookTableAdapter1.Fill(rentalEaseDataSet1.tblCheckbook);
progress++;
//6 Companies
waiting.setProgress(progress, "Companies");
tblCompanyTableAdapter1.Fill(rentalEaseDataSet1.tblCompany);
progress++;
//7 Expenses
waiting.setProgress(progress, "Expenses");
tblExpenseTableAdapter1.Fill(rentalEaseDataSet1.tblExpense);
progress++;
//8 Incomes
waiting.setProgress(progress, "Incomes");
tblIncomeTableAdapter1.Fill(rentalEaseDataSet1.tblIncome);
progress++;
//9 Properties
waiting.setProgress(progress, "Properties");
tblPropertyTableAdapter1.Fill(rentalEaseDataSet1.tblProperty);
progress++;
//10 Rental …Run Code Online (Sandbox Code Playgroud) 快速WPF问题 - 在WPF上的Win 7(我假设Vista),默认进度条做了一个漂亮的小发光"飞快移动"-y动画.
我在一个屏幕上显示了大约48个内容的进度,并且让所有这些东西都在你身上who - - - 你能禁用这些动画而不影响应用程序中的其他默认动画吗?
似乎在Windows 7中,在设置进度条的值时会发生一些动画.设置值似乎不等待动画完成.有没有办法通知进度条何时完成动画?
我有一个示例程序.请参阅评论.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
namespace Testing
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form1();
form.Run();
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void Run()
{
Thread thread = new Thread
(
delegate()
{
ProgressBarMax = 10;
ProgressValue = 0;
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
ProgressValue++;
}
}
); …Run Code Online (Sandbox Code Playgroud)