如何更新进度条使其平滑增加?

Posted

技术标签:

【中文标题】如何更新进度条使其平滑增加?【英文标题】:How to update a progress bar so it increases smoothly? 【发布时间】:2013-01-07 07:01:20 【问题描述】:

我使用 WPF (C#) 的进度条来描述进程的进度。

我的算法如下:

DoSomethingCode1();
ProgressBar.SetPercent(10); // 10%
DoSomethingCode2();
ProgressBar.SetPercent(20); // 20%

...

DoSomethingCode10();
ProgressBar.SetPercent(100); // 100%

可以,但是会导致进度条不连续。

谁能告诉我一些让进度条软更新的建议?

【问题讨论】:

不要在代码中操作 UIElements。学习 MVVM。使用后台线程执行您的操作,然后将百分比属性的更新分派给 UI 线程。 This Answer 可能会帮助你。 “不连续”是什么意思?什么是“软更新”? @HighCore, Abzy:谢谢,不过不是我的问题,以上代码是伪代码。 谢谢,我已经在这个帖子中等待了超过 1.5 年了。 【参考方案1】:

检查您是否可以修改进度条的样式,并为它的情节提要设置一个缓动函数来修改进度条的“填充”,这样它就会有一个平滑的过渡。

【讨论】:

【参考方案2】:

您可以调用BeginAnimation 方法为ProgressBarValue 属性设置动画。在下面的示例中,我使用了DoubleAnimation

我创建了一个获取所需百分比的扩展方法:

public static class ProgressBarExtensions

    private static TimeSpan duration = TimeSpan.FromSeconds(2);

    public static void SetPercent(this ProgressBar progressBar, double percentage)
    
        DoubleAnimation animation = new DoubleAnimation(percentage, duration);
        progressBar.BeginAnimation(ProgressBar.ValueProperty, animation);          
    

所以在你的代码中你可以简单地调用:

myProgressBar.SetPercent(50);

这样做只是平滑了过渡,因此看起来更好。引用另一个answer:“这个想法是进度条报告实际进度 - 而不是经过的时间。它不是一个动画,只是表示正在发生某事 。”但是,进度条的默认样式确实具有脉动效果,这可能意味着工作正在发生。

【讨论】:

@Matt 不错。你的参考资料是什么?你在“使用”之后放的东西?谢谢! 抱歉 - 经过一番研究 - 将 Presentationcore.dll 添加到引用中,然后“使用 System.Windows.Media”。见This Microsoft Website 这是什么 .NET 版本? ProgressBar 上没有 BeginAnimation 事件?【参考方案3】:

试试这个。

private void updateProgressBar(int percent)
    
        if (ProgressBar.InvokeRequired)
        
            updateProgressBarCallback cb = new updateProgressBarCallback(updateProgressBar);
            this.Invoke(cb, new object[]  percent );
        
        else
        
            ProgressBar.Value = percent;
            ProgressBar.Update();
            ProgressBar.Refresh();
            ProgressBar.Invalidate();
        

【讨论】:

抱歉不适合我。我复制并粘贴了您的代码 sn-p。错误说明如下: System.Windows.Control.ProgressBar 不包含更新、刷新、无效的定义。找不到命名空间名称 updateProgressBarCallback,您是否缺少 using 指令或程序集引用? 如果你这样做了,你需要类似的东西:delegate void updateProgressBarCallback(int percent);添加到代码中。 如果您的 UI 线程很忙,这些绘制调用将进入事件队列并立即发生。进度条不会动画。【参考方案4】:

你可以使用行为!

public class ProgressBarSmoother

    public static double GetSmoothValue(DependencyObject obj)
    
        return (double)obj.GetValue(SmoothValueProperty);
    

    public static void SetSmoothValue(DependencyObject obj, double value)
    
        obj.SetValue(SmoothValueProperty, value);
    

    public static readonly DependencyProperty SmoothValueProperty =
        DependencyProperty.RegisterAttached("SmoothValue", typeof(double), typeof(ProgressBarSmoother), new PropertyMetadata(0.0, changing));

    private static void changing(DependencyObject d, DependencyPropertyChangedEventArgs e)
    
        var anim = new DoubleAnimation((double)e.OldValue, (double)e.NewValue, new TimeSpan(0,0,0,0,250));
        (d as ProgressBar).BeginAnimation(ProgressBar.ValueProperty, anim, HandoffBehavior.Compose);
    

您的 XAML 将如下所示:

<ProgressBar local:ProgressBarSmoother.SmoothValue="Binding Progress">

每当您在 xaml 中绑定的 Progress 属性发生变化时,ProgressBarSmoother 行为中的代码就会运行,并使用 ToFrom 的适当值为您将动画添加到进度条!

【讨论】:

我添加了这个解决方案,因为它允许您将报告进度的任何内容与包含进度条的视图解耦。 喜欢这个。稍微调整了持续时间,就像一个魅力。但是,由于Vista以来Windows中的标准进度条是这样做的,它应该已经在WPF进度条中...... 对我的小客户来说是一个完美的解决方案。这太棒了,谢谢!

以上是关于如何更新进度条使其平滑增加?的主要内容,如果未能解决你的问题,请参考以下文章

突发奇想,JavaScript模仿下载进度条效果

使用 Flask 更新进度条

改进xutils下载管理器,使其,在随意地方进行进度更新,以及其它状态监听操作

持续时间长于更新时的 Qt 进度条动画

如何增加进度条? [关闭]

C# 中的 progressBar1 如何使用这个进度条控件.?