web-dev-qa-db-ja.com

ajaxStart / ajaxStopのように、Windows Formsプログラムが「処理中」のときにスピナーを表示しますか?

はいはい。それらは完全に異なる2つのテクノロジーであることを知っています。最近、Web開発からC#とWindows Formsを使用したFAT開発に移りました。私は常に、ajaxStartとajaxStopを使用してスピナーを表示するのは非常に簡単だと思っていたので、ユーザーは何かが発生していることを知り、待ち続けることができました。

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

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

19
bulltorious

それを行うための標準のWindowsフォームの方法はCursor.Current = Cursors.WaitCursor;

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

49
Blorgbeard

私は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
}
12
Amirizzuan

このCodeProject link を追加できますか?

必要なのは、ビルドし、ツールバーからドラッグして使用することだけです。 LoadingCircleコンポーネントはまったく問題なく機能します。チャームのように機能し、カスタマイズすることもできます!

10
Joel

これは、待機カーソルが必要なときに使用する方法です。 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())
{
  ...
}
5
Koray

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

ProcessesSomething();

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

1
Milton Quirino

プログラムが応答しなくなった場合は、UIスレッドで実際の作業を行っているためです。作業をバックグラウンドスレッドに移動し、必要に応じてUIインタラクションを無効にして作業中にユーザーがタッチしないようにします。バックグラウンド作業が終了したら、Control.Invokeを使用して結果をUIスレッドに戻し、UIを更新します。結果、すべてを再度有効にします。

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

別の方法は、マウスカーソルを「待機中」カーソルに変更することです。

1
antiduh

.NET 4.5(VS 2015+)以降、UIスレッドに更新を送信するために、asyncとawaitをProgressと組み合わせて使用​​できます。

クリックして関連記事を開く

0
BJ Patel

はいあります。

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

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

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

0
Kristian