C# 如何更新进度条,使其平稳增长?

C# 如何更新进度条,使其平稳增长?,c#,wpf,progress-bar,C#,Wpf,Progress Bar,我使用WPF(C#)的进度条来描述流程的进度 我的算法如下: DoSomethingCode1(); ProgressBar.SetPercent(10); // 10% DoSomethingCode2(); ProgressBar.SetPercent(20); // 20% ... DoSomethingCode10(); ProgressBar.SetPercent(100); // 100% 这没关系,但它会使进度条不连续 有人可以告诉我一些建议,使进度条能够柔和地更新?检查您是

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

我的算法如下:

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

...

DoSomethingCode10();
ProgressBar.SetPercent(100); // 100%
这没关系,但它会使进度条不连续


有人可以告诉我一些建议,使进度条能够柔和地更新?

检查您是否可以修改进度条的样式,并为其情节提要设置一个缓和功能,以修改“填充”您可以调用
BeginAnimation
方法来设置
progressbar
属性的
值的动画。在下面的示例中,我使用了一个
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);
这样做只是平滑过渡,使其看起来更好。引用另一句话:“这个想法是一个进度条报告实际的进度,而不是经过的时间。它不是一个仅仅表示正在发生事情的动画。”然而,进度条的默认样式确实有一种脉动效果,可以暗示正在发生工作。

试试看

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();
        }

你可以使用一个行为

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行为中的代码将运行,为您将动画添加到进度条中,并为
添加相应的
to
From

不要操纵代码中的UIElements。学习MVVM。使用后台线程执行操作,然后将percentage属性的更新分派给UI线程。也许能帮你,“不连续”是什么意思?什么是“软更新”?@HighCore,Abzy:谢谢,但这不是我的问题,上面的代码是伪代码。谢谢,我在这个线程中等待了超过1.5年,一直在想这个问题。很抱歉没有为我工作。我复制并粘贴了你的代码片段。显示以下内容的错误:System.Windows.Control.ProgressBar不包含更新、刷新和失效的定义。找不到命名空间名称updateProgressBarCallback,是否缺少using指令或程序集引用?如果这样做,则需要以下内容:委托void updateProgressBarCallback(int percent);添加到代码中。如果您的UI线程正忙,这些绘制调用将进入事件队列并立即发生。进度条不会产生动画。我添加了这个解决方案,因为它允许你将报告进度的内容与包含进度条的视图解耦。我喜欢这个。稍微调整了持续时间,效果很好。然而,由于Windows中的标准进度条自Vista以来就已经做到了这一点,它应该已经在WPF进度条中了……对于我的小客户端来说,这是一个完美的插入式解决方案。这个石头,谢谢@马特:很好。你的推荐信是什么?你在“使用”之后放的东西是什么?谢谢抱歉-经过一点研究后-将presentationcore.dll添加到引用中,然后“使用System.Windows.Media”。看看这是什么.NET版本?ProgressBar上没有BeginAnimation事件?