0

所有者として設定されたメイン アプリケーション ウィンドウでモーダル ダイアログを表示しており (のようにdialog.ShowDialog(mainAppWindow))、再びモーダル ダイアログに戻る前に、ユーザーがメイン アプリケーション ウィンドウを一時的に操作できるようにしたいと考えています。

これどうやってするの?Windows フォームを使用しています。

編集: AutoCADはこれをうまくやっています。

4

6 に答える 6

15

次に、モーダルダイアログが必要だとは思いません...

モーダル ダイアログの全体的な目的は、何らかの方法でそれを取り除くまで、ユーザーが何もできないようにすることです。自分の好きなように振る舞うには、独自のフォームクラスを作成するだけでよいと思います。

于 2009-03-30T06:38:30.187 に答える
2

http://en.wikipedia.org/wiki/Modal_window#Criticismsを参照してください... そもそもモーダル ウィンドウを使用すべきではないという考え方があります。

于 2009-03-30T06:43:18.927 に答える
1

親ウィンドウを再度有効にする必要があります。モーダル ダイアログの場合、モーダル ダイアログが閉じられた場合、Windows は親ウィンドウを自動的に無効にし、再び有効にします。

私は試していませんが、親フォームの Enabled プロパティを true に設定するだけで十分です。それが機能しない場合は、EnableWindow Win32 API を使用すると機能します。

于 2009-03-30T08:02:21.920 に答える
0

モーダル/モードレス パラダイムは、ユーザーがメイン アプリケーションとやり取りできるようにする場合はモードレス ウィンドウを使用し、そうでない場合はモーダルを使用するというものです。彼がメイン アプリケーションを使用するのを止めたいが、それを使用し、その後使用しない場合、ユーザー インターフェイスの設計はモーダル/モードレス パラダイムでは機能しません。

于 2009-03-30T06:47:45.500 に答える
0

何らかの理由で、.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
}

クリーンな解決策ではないかもしれませんが (モーダル ダイアログを非表示にする必要がないため)、少なくとも私の状況では機能します。

于 2010-06-22T10:53:14.870 に答える