私はこのコードを持っています:
for(int k = 0; k<11; k++)
{
pBar.Maximum = 10;
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
ただし、問題は、プログレスバーが約 60% いっぱいになるとリセットされることです。プログレスバーがリセットされる前にいっぱいになるようにするにはどうすればよいですか?
私はこのコードを持っています:
for(int k = 0; k<11; k++)
{
pBar.Maximum = 10;
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
ただし、問題は、プログレスバーが約 60% いっぱいになるとリセットされることです。プログレスバーがリセットされる前にいっぱいになるようにするにはどうすればよいですか?
クラシック モードに切り替えると、この不具合は解消されます。プログレス バーは、リセットされる前に完全に表示されます。
これは、クラシック モードではペイント操作が同期的であり、Value
setter が戻る前に完了しますが、テーマ モードでは、値を増やすと何らかのアニメーションが再生され、再生に時間がかかるためです。
反対に、値を小さくするとアニメーションはなくなります。プログレスバーはすぐに縮小されます。
これが約 60% しか表示されない理由です。プログレス バーが最後の数インクリメントのアニメーションを描画する前に、値を減らします (すぐに完了します)。
pBar.Maximum = 10;
int count = 0;
Timer timer = new Timer();
timer.Interval = 1000;
timer.Tick += (source, e) =>
{
pBar.Value = count;
if (pBar.Maximum == count)
{
pBar.Value = 0;
timer.Stop();
}
count++;
}
timer.Start();
あなたの問題は、ループを使用していることです。プログラムがチェック/割り当てを実行し、画面を更新する時間を確保できるように、タイマーを使用する必要があります。
このコードは、for ループを、ループの本体を呼び出すタイマーに置き換えます。タイマーにはインデックス変数がないため、タイマー (カウント) の外で初期化され、ティックごとに更新されます。
最初:すべての interarionpBar.Maximum
に割り当てる理由はありません。ただ行う:
pBar.Maximum = 10;
for(int k = 0; k<11; k++)
{
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
2 番目: コードの結果、反復がブロックされます。正しく動作する方法はありません。ここで行われているように、マルチスレッドを使用して、ループではなく、何らかのものにvalue
基づいて進行状況を変更します。event
tick
私はついにこの問題の解決策を見つけ、それについてここに書きました。アイデアはTHIS SO question からのものでした。
progressBar1.Value = e.ProgressPercentage;
if (e.ProgressPercentage != 0)
progressBar1.Value = e.ProgressPercentage - 1;
progressBar1.Value = e.ProgressPercentage;
if (progressBar1.Maximum == e.ProgressPercentage)
progressBar1.Value = 0;