プロセスの進行状況を説明するために、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);
これを行うと、遷移がスムーズになり、見栄えがよくなります。別の引用 answer : "アイデアは、進行状況バーが実際の進行状況を報告することです-経過時間ではありません。それは意図されていません何かが起こっていることを示すだけのアニメーションである。」ただし、進行状況バーのデフォルトのスタイルには、作業が行われていることを意味する脈動効果があります。
振る舞いが使える!
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
の適切な値を使用してアニメーションがプログレスバーに追加されます。
プログレスバーのスタイルを変更できるかどうかを確認し、プログレスバーの「塗りつぶし」を変更するストーリーボードにイージング関数を設定します。これにより、スムーズな移行が実現します。