如何更新进度条使其平滑增加?
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
方法为ProgressBar
的Value
属性设置动画。在下面的示例中,我使用了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 行为中的代码就会运行,并使用 To
和 From
的适当值为您将动画添加到进度条!
【讨论】:
我添加了这个解决方案,因为它允许您将报告进度的任何内容与包含进度条的视图解耦。 喜欢这个。稍微调整了持续时间,就像一个魅力。但是,由于Vista以来Windows中的标准进度条是这样做的,它应该已经在WPF进度条中...... 对我的小客户来说是一个完美的解决方案。这太棒了,谢谢!以上是关于如何更新进度条使其平滑增加?的主要内容,如果未能解决你的问题,请参考以下文章