2011-08-22 11 views
2

私は強力な名前付きアセンブリを持っています。発信者をブロックしないShowDialog

これは以前に求められていましたが、種類が異なり、目的が異なるだけです。

私はForm基本クラスを持っています。実装クラスが基本クラスのプロパティを設定するときIsBusy。私はフォームとのすべてのやりとりをブロックしたい(Enabled = falseは十分ではない - 私は移動、サイズ変更、閉じるなどをブロックしたいと思うし、IsBusy == trueを表示するとコントロールが無効に見えないようにする)前面にポップアップローディングフォーム(ローディングアニメーションを含む透明なボーダーレスフォーム)。私のローディングアニメーションフォーム上にShowDialogを呼び出す

は、呼び出し元のフォームの相互作用を遮断するという点でトリックを行います...しかし、明らかに私はまた、呼び出し元のフォームのコードが実行を継続します。

私は新しいLoadingForm()を使用しています。Show()を呼び出して、フォームのWndProcを処理してください。IsBusy == true私はすべてのWndProcメッセージを抑制します...しかし、私はこのアプローチが嫌いです。それは、私が欲しくないフォームも再ペイントするのを防ぎます。

IsBusy == trueの間に正しい再塗りつぶしができるようにするために、さまざまな種類のメッセージをすべて知っていれば、WndProcのアプローチはそれほど気にしませんでしたが、そうではありません。

だから、私の質問は:

は、よりよい解決策はありますか?

または

缶誰かがのWndProcメッセージは、私が通過させるべきかを教えて?または用語集をどこで見つけるか?

ありがとうございました。

+0

"明らかに私は呼び出しフォームスレッドが実行を継続したい" - 何もしないだけです。あなたがそこにない問題を解決しているように見えます。 –

+1

これを行う1つの方法は、新しいスレッドを開始して(元のUIスレッドではなく)操作を実行し、メッセージポンプが制御を元の状態に戻すように(スレッドを使用して)形。これの標準的なカプセル化の1つは、BackgroundWorkerを使用することです。 –

+0

あなたが正しいです、BackgroundWorderを使用すると、問題は解消されます。しかし、私はこの変更を一元的に行いたいと思っています。そして、一部の場所では、この変更後にこれらの場所が機能しなくなるBackgroundWorkerを使用しないことがわかります。 – Jeff

答えて

12

私はShowDialogのBeginInvoke'ing終わった:

myForm.BeginInvoke(new Action(() => new LoadingForm().ShowDialog())); 

その行を実行し続けると、まだあるmyFormとのすべての相互作用を遮断した後、コードをさせるの所望の効果を有します。

+0

誰もがあなたに伝えようとしていることだと思います... –

+1

私はそうは思わない。誰もこれを潜在的な解決策として与えていませんでした。程遠い。 – Jeff

+1

コミュニケーションは常に最も難しい部分です... –

3

あなたが絵を通してようにしたい場合は、WM_PAINTWM_NCPAINTを可能にします。

+0

すべての名前付きメッセージ値を持つ静的クラスはありますか?または、int値が提供されている良い用語集がありますか? – Jeff

+1

pinvoke.netはあなたのピンポイントのニーズをすべて満たすことができます:http://pinvoke.net/default.aspx/Enums/WindowsMessages.html – Blindy

2

あなたはあまりにも複雑になっています。ダイアログが閉じないようにするだけです。 FormClosingイベントを実装する(またはOnFormClosingを上書きする、より良い)。そして、操作がビジーである間にe.Cancel = trueを設定する。ユーザーがプロセスを妨害することができるものは何もありません。

これはすべて、操作を実装するためにワーカースレッドを使用したことを前提としています。

+0

私はあなたが問題を正しく理解したとは思いません。バックグラウンドスレッドからIsBusy = trueを安全に設定できるようにするためには、Formを継承するすべてのフォームに依存したくありません。閉鎖だけではなく、私が防止したい、それはすべての相互作用です。 – Jeff

+1

この場合に可能な対話の例を挙げる必要があります。私が考えることのできるものはありません。 –

+0

私がShowDialogを呼び出すと、ローディングウィンドウがダイアログとして機能する唯一の方法です私がそれを行うと、呼び出しスレッドをブロックします。したがって、myForm.IsBusy = trueを設定した人は、その行でハングし、IsBusyをfalseに戻すことはできません....そうすると、Loading Formは永遠に続くでしょう。私はここで何か誤解していますか? – Jeff

関連する問題