web-dev-qa-db-ja.com

Windows Forms ProgressBar:マーキーを開始/停止する最も簡単な方法は?

C#とWindowsフォームを使用しています。プログラムでは正常に動作する通常のプログレスバーがありますが、現在は継続時間を簡単に計算できない別の操作があります。進行状況バーを表示したいのですが、スクロールマーキーを開始/停止する最良の方法がわかりません。私は、マーキーの速度を設定してからstart()とstop()を設定するような単純なものを望んでいましたが、それほど単純ではないようです。バックグラウンドで空のループを実行する必要がありますか?これをどのように行うのが最善ですか?ありがとう

71
Mark Stahler

スタイルをMarqueeに設定した進行状況バーを使用します。これは、不確定な進行状況バーを表します。

myProgressBar.Style = ProgressBarStyle.Marquee;

また、 MarqueeAnimationSpeed プロパティを使用して、プログレスバー全体でアニメーション化するのに色の小さなブロックがかかる時間を設定することもできます。

106
Paul Fisher

アニメーションを開始/停止するには、次を実行する必要があります。

始めること:

progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;

止まる:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
52
_loneranger

仕組みではありません。マーキースタイルのプログレスバーを表示して「開始」し、非表示にして停止します。 Styleプロパティを変更できます。

9
Hans Passant

このコードは、ユーザーが認証サーバーの応答を待つログインフォームの一部です。

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();
        }
    }
}    
8
Arda Basoglu

MSDNのこのトピックのコードには、ニース 記事 があります。 StyleプロパティをProgressBarStyle.Marqueeに設定するのは適切ではないと考えています(または、制御しようとしているものですか??-速度は制御できますが、このアニメーションを停止/開始することはできないと思います) @Paulが示すように)。

2
tvanfosson

すでに多くの良い答えがありますが、UIスレッドで長時間実行される処理(一般的には悪い考え)を実行している場合は、マーキーも移動しないことに注意する必要があります。

1
Nameless One