C# と Windows フォームを使用しています。プログラムで正常に動作する通常の進行状況バーがありますが、現在、継続時間を簡単に計算できない別の操作があります。プログレス バーを表示したいのですが、スクロール マーキーを開始/停止する最良の方法がわかりません。マーキー速度を設定してから start() と stop() を設定するのと同じくらい簡単なことを望んでいましたが、それほど単純ではないようです。バックグラウンドで空のループを実行する必要がありますか? これを行うにはどうすればよいですか?ありがとう
7 に答える
スタイルが に設定された進行状況バーを使用しMarquee
ます。これは不確定な進行状況バーを表します。
myProgressBar.Style = ProgressBarStyle.Marquee;
プロパティを使用してMarqueeAnimationSpeed
、色の小さなブロックがプログレス バーでアニメーション化されるまでの時間を設定することもできます。
アニメーションを開始/停止するには、次のようにする必要があります。
始めること:
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;
止まる:
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
このコードは、ユーザーが認証サーバーの応答を待つログイン フォームの一部です。
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace LoginWithProgressBar
{
public partial class TheForm : Form
{
// BackgroundWorker object deals with the long running task
private readonly BackgroundWorker _bw = new BackgroundWorker();
public TheForm()
{
InitializeComponent();
// set MarqueeAnimationSpeed
progressBar.MarqueeAnimationSpeed = 30;
// set Visible false before you start long running task
progressBar.Visible = false;
_bw.DoWork += Login;
_bw.RunWorkerCompleted += BwRunWorkerCompleted;
}
private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// hide the progress bar when the long running process finishes
progressBar.Hide();
}
private static void Login(object sender, DoWorkEventArgs doWorkEventArgs)
{
// emulate long (3 seconds) running task
Thread.Sleep(3000);
}
private void ButtonLoginClick(object sender, EventArgs e)
{
// show the progress bar when the associated event fires (here, a button click)
progressBar.Show();
// start the long running task async
_bw.RunWorkerAsync();
}
}
}
それは彼らがどのように働くかではありません。マーキー スタイルのプログレス バーを表示することで「開始」し、非表示にすることで停止します。Style プロパティを変更できます。
MSDN には、このトピックに関するコードを含むすばらしい記事があります。Style プロパティを ProgressBarStyle.Marquee に設定することは適切ではないと想定しています (または、それを制御しようとしているのでしょうか?? -- 速度を制御することはできますが、このアニメーションを停止/開始することはできないと思います@Paulが示すように)。
ここにはすでに多くの良い答えがありますが、UI スレッドで長時間実行される処理を行っている場合 (通常は悪い考えです)、マーキーが移動することもありません。
タイマー(System.Windows.Forms.Timer)を使用できます。
Tick イベントをフックし、最大値に達するまで進行バーを進めます。それが (最大に達して) ジョブを終了していない場合は、プログレス バーの値を最小にリセットします。
...ちょうど Windows エクスプローラーのように :-)