私は強力な名前付きアセンブリを持っています。発信者をブロックしないShowDialog
これは以前に求められていましたが、種類が異なり、目的が異なるだけです。
私はForm基本クラスを持っています。実装クラスが基本クラスのプロパティを設定するときIsBusy
。私はフォームとのすべてのやりとりをブロックしたい(Enabled = falseは十分ではない - 私は移動、サイズ変更、閉じるなどをブロックしたいと思うし、IsBusy == true
を表示するとコントロールが無効に見えないようにする)前面にポップアップローディングフォーム(ローディングアニメーションを含む透明なボーダーレスフォーム)。私のローディングアニメーションフォーム上にShowDialogを呼び出す
は、呼び出し元のフォームの相互作用を遮断するという点でトリックを行います...しかし、明らかに私はまた、呼び出し元のフォームのコードが実行を継続します。
私は新しいLoadingForm()を使用しています。Show()を呼び出して、フォームのWndProcを処理してください。IsBusy == true
私はすべてのWndProcメッセージを抑制します...しかし、私はこのアプローチが嫌いです。それは、私が欲しくないフォームも再ペイントするのを防ぎます。
IsBusy == true
の間に正しい再塗りつぶしができるようにするために、さまざまな種類のメッセージをすべて知っていれば、WndProcのアプローチはそれほど気にしませんでしたが、そうではありません。
だから、私の質問は:
は、よりよい解決策はありますか?
または
缶誰かがのWndProcメッセージは、私が通過させるべきかを教えて?または用語集をどこで見つけるか?
ありがとうございました。
"明らかに私は呼び出しフォームスレッドが実行を継続したい" - 何もしないだけです。あなたがそこにない問題を解決しているように見えます。 –
これを行う1つの方法は、新しいスレッドを開始して(元のUIスレッドではなく)操作を実行し、メッセージポンプが制御を元の状態に戻すように(スレッドを使用して)形。これの標準的なカプセル化の1つは、BackgroundWorkerを使用することです。 –
あなたが正しいです、BackgroundWorderを使用すると、問題は解消されます。しかし、私はこの変更を一元的に行いたいと思っています。そして、一部の場所では、この変更後にこれらの場所が機能しなくなるBackgroundWorkerを使用しないことがわかります。 – Jeff