所有者として設定されたメイン アプリケーション ウィンドウでモーダル ダイアログを表示しており (のようにdialog.ShowDialog(mainAppWindow)
)、再びモーダル ダイアログに戻る前に、ユーザーがメイン アプリケーション ウィンドウを一時的に操作できるようにしたいと考えています。
これどうやってするの?Windows フォームを使用しています。
編集: AutoCADはこれをうまくやっています。
所有者として設定されたメイン アプリケーション ウィンドウでモーダル ダイアログを表示しており (のようにdialog.ShowDialog(mainAppWindow)
)、再びモーダル ダイアログに戻る前に、ユーザーがメイン アプリケーション ウィンドウを一時的に操作できるようにしたいと考えています。
これどうやってするの?Windows フォームを使用しています。
編集: AutoCADはこれをうまくやっています。
次に、モーダルダイアログが必要だとは思いません...
モーダル ダイアログの全体的な目的は、何らかの方法でそれを取り除くまで、ユーザーが何もできないようにすることです。自分の好きなように振る舞うには、独自のフォームクラスを作成するだけでよいと思います。
http://en.wikipedia.org/wiki/Modal_window#Criticismsを参照してください... そもそもモーダル ウィンドウを使用すべきではないという考え方があります。
親ウィンドウを再度有効にする必要があります。モーダル ダイアログの場合、モーダル ダイアログが閉じられた場合、Windows は親ウィンドウを自動的に無効にし、再び有効にします。
私は試していませんが、親フォームの Enabled プロパティを true に設定するだけで十分です。それが機能しない場合は、EnableWindow Win32 API を使用すると機能します。
モーダル/モードレス パラダイムは、ユーザーがメイン アプリケーションとやり取りできるようにする場合はモードレス ウィンドウを使用し、そうでない場合はモーダルを使用するというものです。彼がメイン アプリケーションを使用するのを止めたいが、それを使用し、その後使用しない場合、ユーザー インターフェイスの設計はモーダル/モードレス パラダイムでは機能しません。
何らかの理由で、.NET でも同じ問題に直面しなければなりません。モーダル ダイアログを表示する (メイン) フォームがありますが、これを非表示にし、メイン ウィンドウとやり取りして、再びモーダル ダイアログに戻る必要があります。
私は個人的に Windows (API) の観点からの結果を理解していませんが、次の解決策は私にとってはうまくいきます。
全体の秘訣は、モーダル ダイアログを表示する前にメイン フォームを無効に設定することにあります (メイン フォームが Enabled = false に明示的に設定されていない場合、モーダル ダイアログを非表示にした後は、 Enabled = true が呼び出されても対話を行うことはできません)。
モーダル ダイアログ イベント (NeedInteraction と呼ばれます) への応答として、モーダル ダイアログを非表示にし、メイン フォームを有効にし、いくつかのループでユーザーとの対話を行い、メイン ダイアログを無効にして、モーダル ダイアログを再度表示します。
void ShowDialog()
{
var dialog = new MyModalForm();
dialog.NeedInteraction += (sender, eventArgs) =>
{
dialog.Hide();
Enabled = true;
//wait till user finishes working with main window
Enabled = false;
dialog.Show();
}
Enabled = false;
dialog.ShowDialog();
Enabled = true; //don't forget to make it enabled afterwards
}
クリーンな解決策ではないかもしれませんが (モーダル ダイアログを非表示にする必要がないため)、少なくとも私の状況では機能します。