web-dev-qa-db-ja.com

プログレスバーを更新してスムーズに増加させる方法は?

プロセスの進行状況を説明するために、WPF(C#)の進行状況バーを使用しています。

私のアルゴリズムは以下の通りです:

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

...

DoSomethingCode10();
ProgressBar.SetPercent(100); // 100%

大丈夫ですが、プログレスバーがシーケンシャルではなくなります。

誰かがプログレスバーをソフトに更新するいくつかの提案を教えてもらえますか?

22
TTGroup

BeginAnimationメソッドを呼び出して、ProgressBarValueプロパティをアニメーション化できます。以下の例では、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 : "アイデアは、進行状況バーが実際の進行状況を報告することです-経過時間ではありません。それは意図されていません何かが起こっていることを示すだけのアニメーションである。」ただし、進行状況バーのデフォルトのスタイルには、作業が行われていることを意味する脈動効果があります。

19

振る舞いが使える!

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動作のコードが実行され、ToFromの適切な値を使用してアニメーションがプログレスバーに追加されます。

41
Owen Johnson

プログレスバーのスタイルを変更できるかどうかを確認し、プログレスバーの「塗りつぶし」を変更するストーリーボードにイージング関数を設定します。これにより、スムーズな移行が実現します。

3
dutzu