7

ボタンがある場合は、次のようにします。

Private Function Button_OnClick

    Button.Enabled = False

    [LONG OPERATION] 

End Function

長い操作により UI スレッドがコントロールを再描画できないため、ボタンはグレー表示されません。バックグラウンドスレッド/ディスパッチャーを開始するのが正しい設計であることは知っていますが、単純な操作には面倒な場合があります。

では、無効な状態でボタンを強制的に再描画するにはどうすればよいですか? ボタンで .UpdateLayout() を試しましたが、効果はありませんでした。WinFormsの使用時に通常動作する System.Windows.Forms.DoEvents() も試しましたが、効果もありませんでした。

4

3 に答える 3

8

次のコードはあなたが探していることをします。しかし、私はそれを使用しません。長時間の操作にはBackgroundWorkerクラスを使用します。使いやすく、非常に安定しています。
ここにコードがあります:

   public static void ProcessUITasks() {            
        DispatcherFrame frame = new DispatcherFrame();
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) {
            frame.Continue = false;
            return null;
        }), null);
        Dispatcher.PushFrame(frame);
    }

ここでは、BackgroundWorkerの使用方法のサンプルを見つけることができます。

于 2011-11-14T22:02:14.730 に答える
0

InvalidateVisual(); @HCLは正しい...これをしないでください

あなたが言うように、バックグラウンド スレッド/ディスパッチャの使用を開始し、UI スレッドのブロックを解除しておくことをお勧めします。高レベルの非同期 UI プログラミングについては、MicrosoftのReactive Extensions ライブラリを参照することを検討してください。

于 2011-11-14T21:57:55.053 に答える
0

In Windows.Forms, you can Button.Refresh().

In Windows.Forms or WPF, you can yield to the message pump to let it redraw. Async/Await were designed to allow you to do this without the nastiness of HCL's answer.

Private Async Function Button_OnClick

    Button.Enabled = False

    Await Task.Yield

    [LONG OPERATION] 

End Function
于 2017-06-10T08:33:17.873 に答える