0

GUI全体がロードされます。特定のボタンをクリックした後、GUI が応答しません。どのボタンも応答しません。別のアプリに切り替えて元に戻せば、GUI はすぐに OK です。クリックされたボタンの背後にあるのは、バックエンドにリクエストを送信するハンドルです。アプリをデバッグしましたが、データは常に返されました。アプリが巨大で慣れていないため、リクエストの送信とデータの処理の単純なモデルを抽出できません。

よろしくお願いします、

- - -さらに追加 - - -

バックエンド要求の送信は、スレッドプール スレッドにあります。データを取得するとき、UI コントロールは直接更新されません。UI コントロールにバインドされているプレゼンター (ビュー モデル) のみが更新されます。

4

2 に答える 2

3

sa-ddam213が示唆したように、バックグラウンドThreadまたはTaskでコード ブロックを実行していると思います。

問題は次のとおりだと思います
-ボタンをクリックすると、バックグラウンドで実行が開始されます。-ボタンの
バックグラウンド プロセスが実行されているかどうかを確認するためのフラグを保持しています。 - UIはボタンをしばらくチェックしますが、ここで別の質問に記載されているようにチェックしません - Josh Smith の RelayCommand の実装には欠陥がありますか? . - プロセスはバックグラウンドで戻ります。 - UI はバックグラウンド プロセスが完了したことを認識せず、ボタンのチェックを停止したため、UI はそれ自体を認識しません.. (通知する必要があります) - したがって、UI は応答しませんが、ユーザーがどこかをクリックするとアプリケーションまたはあなたが言ったようにインアウトを行うと、再び元に戻ります。CanExecute()Command
CanExecute()Command

CanExecute()Command

解決策
- InvalidateRequerySuggestedメソッドを使用すると、UI スレッドでコマンド requery を呼び出すことができるため、UI はCanExecute()for eachControlおよび/またはを再チェックしButton Commandます。

// Forcing the CommandManager to raise the RequerySuggested event
CommandManager.InvalidateRequerySuggested();

InvalidateRequerySuggestedメソッドは、CommandManagerRequerySuggested イベントを強制的に発生させます。RequerySuggested イベントは、関連付けられているコマンドを照会して、コマンドを実行できるかどうかを判断するようコマンド ソースに通知します。

詳細については、次を参照してください。
- CommandManager.RequerySuggested はどのように機能しますか?
- MSDN - CommandManager
- MSDN - CommandManager.InvalidateRequerySuggested メソッド

于 2013-01-04T06:17:39.420 に答える
1

それは単なる推測ですが、クリックイベント内のロジックの優先度を下げてみてください

private void Button_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate
    {
        // all your code here.
    });
}
于 2013-01-04T05:41:15.723 に答える