2011-01-22 13 views
0

プログレスオブジェクトとしてボーダレスフォームが表示されています。これはchildform.show()によって表示されます。ダイアログなしで子フォームに注目してください。

CS_DROPSHADOWをオーバーライドして影(図)、 がフォームがフォーカスを失うと(親クリックまたは別のフォーム\アプリケーション)、影が失われます。

モーダルフォームに似たフォームをフォーカスした状態に保つにはどうすればよいですか? (これは、UI以外のさまざまなスレッドから呼び出されるため、showdialogを使うことはできません)Me.TopMost = Trueを使うと、明らかに、親だけでなく他のすべてのフォームの上にフォームが置かれます。限り、あなたは、あなたが本当に真のTopMostの=で立ち往生しているワーカースレッドでこのウィンドウを作成しているよう

alt text

答えて

1

。 WinformsはShow(owner)オーバーロードを使用させません。UIスレッドによって親が所有されていることが検出されると、InvalidOperationExceptionがスローされます。 Show()を呼び出すだけで、デスクトップウィンドウがオーナーになります。どちらが問題なのか、進捗ウィンドウは別のウィンドウの後ろに消えることがあり、ユーザーはそれを簡単に取り戻すことができません。非同期であるため、これはユーザがUIウィンドウで作業している間にとなり、ユーザはポップアップに気付かないこともあります。

この問題を回避するには、Control.BeginInvoke()を使用して、メソッドがUIスレッドでダイアログを作成できるようにします。今すぐShowDialog()を呼び出すことができます。すべての問題は解決されます。

関連する問題