我在C#中有一个小程序,它重命名并调整给定目录中所有图片的大小。
问题是,即使每个文件都是在一个循环中处理的,并且ProgressBar.Increment(1)
在这个循环的末尾,它仍然在加载时跳过一些数字,就像它的异步。我不想那样,我想要它顺利,并显示它是确切的文件,没有任何滞后或延迟。有什么不对的?
private void renameAndResizeFiles() {
string[] fileEntries = Directory.GetFiles(directory);
int filesNumber = fileEntries.Length;
progressBar.Maximum = filesNumber;
int i = 1;
foreach (string oldFileNamePath in fileEntries) {
// handle file work
i++;
updateProgressBar(filesNumber, i);
}
progressBar.Refresh();
progressBar.Value = 0;
}
private void updateProgressBar(int filesNumber, int i) {
progressBar.Refresh();
progressBar.CreateGraphics().DrawString(i + " / " + filesNumber,
new Font("Arial", (float) 10.0, FontStyle.Regular),
Brushes.Black,
new PointF(progressBar.Width / 2 - 10, progressBar.Height / 2 - 7));
progressBar.Increment(1);
}
另外,这是在进度栏上显示文本的最佳方式吗?
发布于 2015-06-12 18:17:13
关于进度条上的文本,这取决于您使用的是WinForms还是WPF。如果使用WPF,我会考虑在xaml中布局某种网格,在其中您可以在部分进度条上放置一个TextBlock,并使用DependencyProperties更新它们。对于WinForms不太确定,但可能不是.CreateGraphics().DrawString(),您最好还是把ProgressBar和TextBlock控件放在适当的位置,并直接更新它们。
至于顺利的更新,这很可能是因为您没有最小的更新时间,而且有些更新可能太快了,以至于似乎“跳过”了它们。要确保看到每个进度栏步骤,请尝试在更新进度条方法中的某个位置插入一个Thread.Sleep(50)
。
https://stackoverflow.com/questions/30809296
复制相似问题