【问题标题】:How to use Progressbar in MVVM如何在 MVVM 中使用进度条
【发布时间】: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


【解决方案1】:

将“Generate”方法的全部内容放在一个任务中。然后,您无需执行任何特殊操作来更新进度,因为 WPF 在 UI 级别自动编组“NotifyPropertyChanged”事件。 像这样的:

Task.Factory.StartNew(() => {
    foreach (var art in articles)
    {       
        //[..]
        //Insert article                    

        inserted++;

        updateProgress(inserted);                    
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多