1

機能が終了するまでに時間がかかるボタンがありますが、長い待ち時間(5秒)のためにアプリケーションが停止したようです。したがって、長時間実行する関数の前に配置Cursor = Cursors.Waitし、関数の後に配置するCursor = Cursors.Arrowと、すべてが機能しました。

しかし、それはそのようなことをするための本当にひどい方法だと思います。

そのため、ボタンがその機能を実行しているときにカーソルが変化するように、カーソルをボタンのプロパティにバインドできるかどうかを知りたいのです。

4

4 に答える 4

1

長時間実行される機能 (おそらくプロデュース/コンシューマー パターン) にバックグラウンド ワーカーを使用しないのはなぜですか? 私の意見では、それが最善の方法です。プログレス バーでユーザーのリクエストのステータスを知らせることもできます。

于 2012-05-08T00:10:33.077 に答える
0

私が考えることができる最も簡単なことは、IDisposableを実装するクラスを作成し、コンストラクターで待機カーソルを変更して、Disposeメソッドで元に戻すことです。これにより、ラップするコードの実行中に例外がスローされた場合でも、カーソルが待機カーソルとしてスタックすることはありません...

public class WaitCursor : IDisposable
{
    private Cursor m_defaultCursor = null;
    public WaitCursor()
    {
        m_defaultCursor = Cursors.Current;
        Cursors.Current = Cursors.WaitCursor;
        Application.UseWaitCursor = true;
    }

    public void Dispose()
    {
        Cursors.Current = m_defaultCursor;
        Application.UseWaitCursor = false;
    }
}

次に、実行時間の長いコードをusingステートメントでラップするだけです...

using (var waitCursor = new WaitCursor())
{
    // some long running code...
}

そのようなものは、ラップされたコードもおそらく時間がかかることを将来の開発者に明らかにします

于 2012-05-08T01:26:11.960 に答える
0

理論的には、ボタンの状態が変化するたびにマウスカーソルを設定する依存関係プロパティをどこかに作成できます。ただし、ボタン クリック ハンドラー内で作業を行っている場合は、UI スレッドが依存オブジェクトを更新するためにディスパッチする必要があるため、何もしない可能性があります。また、UI スレッドをブロックしている場合、タスクが完了するまで、ボタンが視覚的に「押されていない」ことはありません。また、それを開いている、おそらく変化するボタンのセットにどのようにバインドしますか? 満足のいく解決策とは思えません。

WPF アプリでこのようなシナリオを処理する最善の方法は、実行時間の長いタスクをバックグラウンド スレッド (またはスレッド プール) で実行することだと思います。これは、終了時にその結果を UI スレッドにポストします。これが発生している間は、UI を完全にインタラクティブなままにするか、待機カーソルを使用する (そして UI を明示的に無効にする) か、「処理中です。[キャンセル ボタン] をお待ちください」というダイアログでブロックすることができます。あなたはキャンセルオプションを与えたいと思います。

バックグラウンド スレッドで処理を行うことは、移動/最小化/最大化などのウィンドウ管理アクションに対する WPF アプリケーション ウィンドウの応答性を維持するのにも役立ちます。

于 2012-05-08T03:51:17.977 に答える