2011-11-11 11 views
2

winform1がモーダルダイアログを取得すると、winform1とwinform2はすべて「無効」になります。すべてのフォームを最小化してからwinform1を呼び出すと、その上にモーダルダイアログが表示されます。今度はすべてのフォームを最小化するとwinform2が現れますが、winform1のように本当に無効になっている間はfinform2を使用できるように見えます。2つのwinformsモーダルダイアログの状況を

winform2を再度使用する前にモーダルダイアログを処理する必要があることを明確に示すことが必要です。

これを処理するために何かが組み込まれているのですか、それとも自分でここにいますか?

+0

可能ですが難しいです。あなたが作成したモーダルダイアログ(例えば、 'modalForm = new Form();')か、それとも 'MessageBox'ですか? –

+0

modalFormは通常作成されたwinform(modalForm = newForm();) – Banshee

+0

です。これに基づいて回答を投稿しました。 (MessageBoxの場合、動作しない可能性があります)。 –

答えて

2

、これを呼び出す:

static void FocusModalForm() 
    { 
     foreach (Form form in Application.OpenForms) 
      if (form.Modal) 
      { 
       form.WindowState = FormWindowState.Normal; 
       form.BringToFront(); 
      } 
    } 

例えば

Form f2 = new Form(); 
    f2.Activated += (_, __) => FocusModalForm(); 
    f2.Show(); 

あなたはwinform1Activatedイベントのために同じことを行う必要があるかもしれません。それはどのようにwinform2が作成されるかによって異なります。それを試してみて、winform1(または他の非モーダル形式)がまだモーダルフォームの前に入ることができる場合は、ActivatedイベントからFocusModalForm()を呼び出してください。

私はすべてのウィンドウを隠し(タスクバーのデスクトップ表示ボタンをクリックして)、タスクバーから直接form2を選択してみました。また、すべてのウィンドウを隠すことなくタスクバーからform2を選択しました。 Form3は常に上にとどまった。

+0

私はこれを試して、それは素晴らしいです。私は静的メソッドを使用していませんでしたが、通常のものですが、複数のフォームに使用する場合は、静的メソッドを使用する際にこの点が分かります。私は、通常のメッセージボックスがどのように動作するのか試していない。どうもありがとう! – Banshee

+0

通常のMessageBox.Showが使用されている場合、この解決策は機能しません。 – Banshee

+0

@SnowJim:私が知っているのは、フォームをどのように作成したのかということです。 MessageBox.Showと連携させたい場合は、もっと多くの作業が必要です。 (言い換えれば、なぜ動作しないのかわかりません):) –

0

私はwin1がwin2を呼び出してwin2がwin3を表示しwin2がwin3を表示し、win2がwin2を呼び出すが、wins 2 & 3は両方ともモーダルです。それが効果的かどうかは分かりません。おそらくそれはあなたのための選択肢ですか?

+0

しかしwin3にモーダルダイアログがない場合、win1 och win2に切り替えるのは簡単です。したがって、これらはモーダルに設定することはできません。 – Banshee

0

あなたがこれを行う場合:

var winform2 = new Winform2(); 
winform2.Show(winform1); 

を次にwinform2は常にwinform1の上に表示されますが、それはモーダルではありません。これがあなたを助けることができるかもしれません。あなたのwinform2.Activatedイベントハンドラで

+0

これは、winform2のモーダルダイアログとしてwinform1を開こうとしますが、これは私が望むものではありません。 – Banshee

+0

@SnowJim:いいえ、これはwinform2を(既に開いている)winform1を所有者として開きます。つまり、winform2は常にwinform1の前に表示されます。 winform1が最小化されると、winform1が復元されるまでwinform2は自動的に非表示になります。さらに、winform1がクローズされると、winform2も自動的に閉じられます。 –

関連する問題