22

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

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

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

...

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

大丈夫ですが、プログレスバーがシークエントではなかったようになります。

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

4

4 に答える 4

42

振る舞いが使える!

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

于 2013-11-07T23:17:02.153 に答える
21

メソッドを呼び出して、のプロパティBeginAnimationをアニメーション化できます。以下の例では、を使用しました。ProgressBarValueDoubleAnimation

必要なパーセンテージを取り込む拡張メソッドを作成しました。

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);

これを行うと、遷移がスムーズになり、見栄えが良くなります。別の答えを引用すると、「プログレスバーは、経過時間ではなく実際の進行状況を報告するという考え方です。何かが起こっていることを示すだけのアニメーションを意図したものではありません。」ただし、プログレスバーのデフォルトのスタイルには脈動効果があり、作業が行われていることを意味します。

于 2013-01-23T19:32:23.787 に答える
3

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

于 2013-01-23T17:37:49.910 に答える
-1

これを試してください。

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();
        }
于 2013-10-04T08:05:25.977 に答える