2012-01-25 13 views
15

はい、はい。私は彼らが2つの全く異なる技術であることを知っています。私は最近、Web開発からC#とWindows Formsを使ってFAT開発に移りました。私はいつもajaxStartとajaxStopを使ってスピナーを表示するのはとても簡単だと思っていたので、ユーザーは何かが起きているのを知り、待っています。ajaxStart/ajaxStopと同様に、Windows Formsプログラムが「処理中」のときにスピナーを表示しますか?

グローバルに実装できるC#Windowsフォームには、同等の簡単な手法がありますか?たとえば、DBにクエリを実行していくつかの結果を待っている場合、通常、プログラムは数秒間応答しなくなり、「処理した」後に再び作業を開始します。私のプログラムが応答しなくなって新しいスレッドを取り除く可能性があるプログラム内の可能なポイントをすべて特定するのではなく、プログラムが "処理中"の間にスピナーを表示できるグローバルな方法はありますか?

私に不明な点がある場合はお知らせください。

+0

、このコントローラーを使用できます。 http://www.codeproject.com/Tips/1004624/Gif-viewer-Snipper-control – xwpedram

答えて

35

これを行う標準のWindowsフォームの方法は、Cursor.Current = Cursors.WaitCursor;です。

それはあなたのために働くのでしょうか、それともイメージでなければなりませんか?

+0

私はそれがイメージであることを願っています...お勧めですか? – bulltorious

+0

アニメーションは表示できますが、GUIスレッドがブロックしている場合は更新されません(マウスカーソルはWindowsによって処理されるため、GUIがブロックされているかどうかは関係ありません)。どんなことをしても、別のスレッドで作業する必要があります。 – Blorgbeard

+0

[アニメーションGIFをC#で表示する]良いQ/Aがあります(http://stackoverflow.com/questions/165735/how-do-you-show-animated-gifs-on-a-windows-form-c )。 – Blorgbeard

0

はいあります。

「読み込み」インジケータを有効にする方法と、読み込み状態を無効にする方法の2つのユーティリティメソッドを作成するのが簡単でした。

すべての初期のajax呼び出し(またはその他の長い呼び出し)では、自動的にenableメソッドが呼び出されます。

oncompleteコールバックが発生するとすぐに、oncompleteコールバックからdisableメソッドを呼び出します。

1

プログラムが応答しなくなった場合は、UIスレッドで実際の作業が行われているためです。作業をバックグラウンドスレッドに移動し、必要に応じてUIのやりとりを無効にして、作業中にユーザーが作業に触れないようにしてから、バックグラウンドの作業が終了したら、Control.Invokeを使用してUIスレッドに結果を戻します。結果を確認し、すべてを再び有効にします。

スピナーを実装するには、スピンナーgifを持つPictureBoxを使用します。 UIがアイドル状態のときは無効にし、バックグラウンドワーカーを起動すると有効にします。

代わりに、マウスカーソルを「待ち」カーソルに変更することができます。これは私が大ファンではないものです。

9

このCodeProjectを追加できますlink

ツールバーからドラッグして使用するだけでビルドできます。 LoadingCircleコンポーネントは問題なく動作します。魅力のように動作し、カスタマイズすることもできます!

+2

このコントロールは.Net 4でうまくいきました。 – Maggie

+0

あなたは、素晴らしいリファレンスです(3年後)! – Damian

+0

あなたは本当に男です! v4.5.2フレームワーク/ VS2015 – Polis

1

処理前: Cursor.Current = Cursors.WaitCursor;

ProcessesSomething();

処理後: Cursor.Current = Cursors.AppStarting;

7

私はVisual Studio Enterprise 2015を使用しています。ここに示されている推奨されているカーソルスタイル/タイプは、どれも私と一緒に働いていません。

私と一緒に働いているものは次のとおりです。

private async void button_Click(object sender, RoutedEventArgs e) 
{ 
    Cursor = Cursors.Wait; // change cursor to hourglass type 
    ThatProcessThatTookVeryLongTime(); 
    Cursor = Cursors.Arrow; // change cursor to normal type 
} 
+1

でこれを再構築しました.... – Ziggler

4

これは私が待機カーソルを必要なときに使用したい方法です。 try-finallyコードを記述するのではなく、

#region WaitCursor 
    public static IDisposable BeginWaitCursorBlock() 
    { 
     return ((!_waitCursorIsActive) ? (IDisposable)new waitCursor() : null); 
    } 
    private static bool _waitCursorIsActive; 
    private class waitCursor : IDisposable 
    { 
     private Cursor oldCur; 
     public waitCursor() 
     { 
      _waitCursorIsActive = true; 
      oldCur = Cursor.Current; 
      Cursor.Current = Cursors.WaitCursor; 
     } 
     public void Dispose() 
     { 
      Cursor.Current = oldCur; 
      _waitCursorIsActive = false; 
     } 
    } 
    #endregion 

使用例:

using (BeginWaitCursorBlock()) 
{ 
    ... 
} 
+1

私はこれを大成功に開始しました! – Hanny

0

.NET 4.5(VS 2015+)以来、あなたは、非同期の組み合わせを使用してUIスレッドへの更新を送信するための進捗状況を待つことができます。

click to open Related Artical

アニメーション画像の場合は
関連する問題