我使用的WPF(C#)进度条描述这一过程的进展情况。
我的算法是如下:
DoSomethingCode1();
ProgressBar.SetPercent(10); // 10%
DoSomethingCode2();
ProgressBar.SetPercent(20); // 20%
...
DoSomethingCode10();
ProgressBar.SetPercent(100); // 100%
这没关系,但它将使进度条不相继式。
有人能告诉我一些建议,使进度条轻声更新?
你可以把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);
这样做,根本出平滑过渡,所以它看起来更好。 引述另一回答 :“我们的想法是,一个进度条报告的实际进展 -不经过时间它并非是一个动画,只是表示事情正在发生 。” 然而,进度条的默认样式确实有这可能意味着工作发生脉动的效果。
您可以使用行为!
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}">
每当Progress
要绑定在XAML的变化特性,在ProgressBarSmoother行为的代码将运行,与适当的值加动画的进度条,你To
和From
!
检查您是否可以修改进度的样式和设置缓动函数,以它的故事板可修改通过这样做,将有一个平稳过渡的进度和“填充”。
尝试了这一点。
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();
}