151

かなり長いプロセスの実行中に進行状況メッセージを表示するフォームがあります。これは Web サービスの呼び出しであるため、進行状況バーに完了率を意味のある形で表示することはできません。(プログレスバーの Marquee プロパティは特に好きではありません)

アニメーション GIF を表示して、プロセスにアクティビティの感触を与えたいと思います (たとえば、Windows のコピー プロセスのように、あるコンピューターから別のコンピューターに移動するファイル)。

これどうやってやるの?

4

7 に答える 7

263

それほど難しくありません。

  1. ピクチャボックスをフォームにドロップします。
  2. .gif ファイルを画像として画像ボックスに追加します
  3. ロード中にピクチャボックスを表示します。

考慮事項:

  • ピクチャボックスを無効にすると、gif がアニメーション化されなくなります。

アニメーション GIF:

アニメーション GIF を探している場合は、それらを生成できます。

AjaxLoad - Ajax ローディング GIF ジェネレーター

それを行う別の方法:

非常にうまく機能することがわかった別の方法は、コード プロジェクトで見つけた非同期ダイアログ コントロールです。

于 2008-10-03T04:59:05.147 に答える
12

私も同じ問題を抱えていました。バックグラウンドで長時間動作しているため、フォーム全体 (gif を含む) の再描画が停止します。これが私がこれを解決した方法です。

  private void MyThreadRoutine()
  {
   this.Invoke(this.ShowProgressGifDelegate);
   //your long running process
   System.Threading.Thread.Sleep(5000);
   this.Invoke(this.HideProgressGifDelegate);
  }

  private void button1_Click(object sender, EventArgs e)
  {
   ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
   Thread myThread = new Thread(myThreadStart);
   myThread.Start(); 
  }

この操作を担当する別のスレッドを作成しただけです。この初期フォームのおかげで、問題なく再描画が続行されます (私の gif の動作を含む)。ShowProgressGifDelegate と HideProgressGifDelegate は、gif を含む pictureBox の visible プロパティを true/false に設定する形式のデリゲートです。

于 2010-12-19T14:48:40.930 に答える
7

Windows では、伝統的にアニメーション GIF を使用せず、AVI アニメーションをほとんど使用しないことに注意してください。それらを表示するためだけの Windows ネイティブ コントロールがあります。アニメーション GIF を AVI に (およびその逆に) 変換するツールもあります。

于 2008-10-03T05:16:41.890 に答える
3

PictureBox コントロールに配置すると、動作するはずです。

于 2008-10-03T04:58:17.520 に答える
1

同じスレッドにいるため、すべてが停止するため、長い操作を開始するときはそうではありません。

于 2009-02-17T13:57:12.500 に答える
0

私は同じ問題を抱えていて、以前はいくつかの異なる問題に直面していた実装によって、さまざまな解決策に出くわしました。最後に、以下は、期待どおりに機能するさまざまな投稿の一部をまとめたものです。

private void btnCompare_Click(object sender, EventArgs e)
{
    ThreadStart threadStart = new ThreadStart(Execution);
    Thread thread = new Thread(threadStart);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

PictureBox コントロールの呼び出しも実行する Execution メソッドを次に示します。

private void Execution()
{
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
    Application.DoEvents();

    // Your main code comes here . . .

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}

PictureBox は [プロパティ] ウィンドウからは見えないことに注意してください。または、以下を実行してください。

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
于 2017-02-08T01:06:59.140 に答える