Windows Vista以降では、ProgressBarの値を変更してもすぐにはバーの長さが変わらず、1テンポ遅れてバーが徐々に伸びていきます(下図)。このような動作は時として邪魔です。ここでは、ProgressBarの値を変更すると、すぐにバーの長さがその値になるようにする方法を紹介します。
これは、「winforms - Disabling .NET progressbar animation when changing value? - Stack Overflow」などで紹介されている方法です。
ProgressBarコントロールでは、Valueプロパティの値を増やした時はバーが徐々に伸びますが、減らした時はすぐにその長さになります。これを利用して、Valueプロパティの値を設定したい値より大きな値にしてから、すぐに本来設定したい値にすることで、バーをすぐに伸ばすことができます。
Valueプロパティを最大値(Maximumプロパティと同じ値)にする時は、Maximumプロパティを増やしてからValueプロパティを増やして、元に戻します。
以下に示すメソッドを使用してプログレスバーの値を設定すると、バーが徐々に伸びることなく、すぐにその長さになります。
'Imports System.Windows.Forms ''' <summary> ''' バーが徐々に伸びるアニメーションを無効にして、 ''' ProgressBarのValueに値を設定する。 ''' </summary> ''' <param name="pb">値を設定するProgressBar</param> ''' <param name="val">設定する値</param> Public Shared Sub SetProgressBarValue(pb As ProgressBar, val As Integer) If pb.Value < val Then '値を増やす時 If val < pb.Maximum Then '目的の値より一つ大きくしてから、目的の値にする pb.Value = val + 1 pb.Value = val Else '最大値にする時 '最大値を1つ増やしてから、元に戻す pb.Maximum += 1 pb.Value = val + 1 pb.Value = val pb.Maximum -= 1 End If Else '値を減らす時は、そのまま pb.Value = val End If End Sub
//using System.Windows.Forms; /// <summary> /// バーが徐々に伸びるアニメーションを無効にして、 /// ProgressBarのValueに値を設定する。 /// </summary> /// <param name="pb">値を設定するProgressBar</param> /// <param name="val">設定する値</param> public static void SetProgressBarValue(ProgressBar pb, int val) { if (pb.Value < val) { //値を増やす時 if (val < pb.Maximum) { //目的の値より一つ大きくしてから、目的の値にする pb.Value = val + 1; pb.Value = val; } else { //最大値にする時 //最大値を1つ増やしてから、元に戻す pb.Maximum++; pb.Value = val + 1; pb.Value = val; pb.Maximum--; } } else { //値を減らす時は、そのまま pb.Value = val; } }
「ProgressBarの色を変える」で紹介しているようにProgressBarの状態をErrorやPausedにすると、バーがすぐに伸びるようになります。また、バーが光るようなアニメーション効果もなくなります。ただし色は黄色や赤になります。詳しくはリンク先のページをご覧ください。
同じく「ProgressBarの色を変える」で紹介している自分で描画する方法でも、この問題を解決できます。詳しくはリンク先のページをご覧ください。