C# 如何更新进度条,使其平稳增长?
我使用WPF(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% 这没关系,但它会使进度条不连续 有人可以告诉我一些建议,使进度条能够柔和地更新?检查您是
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事件?