【发布时间】:2016-01-07 16:32:49
【问题描述】:
我真的坚持这一点。我在网上搜索了很多,但实际上没有任何帮助。在我看来,我有一个按钮和进度条,当用户单击按钮时,它会执行不同的工作,并且在增加 CurrentProgress 之后。
但它仅在工作结束时向用户显示最终 100%,而不是我想要的。我希望每次 CurrentProgress 增加它都会显示并显示到视图中。
视图中的控件是:
<Button x:Name="Generate" Content="Generate" />
<ProgressBar Value="{Binding Path=CurrentProgress, Mode=OneWay}" Width="80" Height="15"/>
这是 ViewModel 中的代码
private int currentProgress;
public int CurrentProgress
{
get { return currentProgress; }
set
{
if (currentProgress == value)
return;
currentProgress = value;
NotifyOfPropertyChange(() => CurrentProgress);
}
}
List<Article> articles;
public void Generate()
{
foreach (var art in articles)
{
//[..]
//Insert article
inserted++;
Task.Factory.StartNew(() =>updateProgress(inserted));
}
}
private void updateProgress(int Analyzed)
{
if (Analyzed != 0)
{
int percentage = 100 * Analyzed / articles.Count;
CurrentProgress = percentage;
}
}
如何解决这个问题?在此先感谢大家!
【问题讨论】:
-
您需要在后台线程上执行您的工作并在 UI 线程上更新您的进度 - 您正在以相反的方式执行此操作,因此您的 UI 将被阻塞直到它完成。
-
附带说明,您在计算
percentage时使用的所有值都是整数,因此它们都会四舍五入到最接近的整数。您可能必须将其转换为带小数的东西 -
当您在 UI 线程上工作时,在工作完成之前不会重绘 UI。那是因为线程在做工作,而不是更新 UI。如果您要开发更复杂的应用程序,这是一个重要的概念。
标签: c# wpf mvvm progress-bar