2009-04-06 3 views
0

Form.ShowDialog()でダイアログを表示しています。フォームはTopMostに設定されています。一部の画像処理計算は、バックグラウンドで非同期に実行されます。それらの結果はInvokeによってメインフォームに表示されます。ここまでは順調ですね。奇妙なことは、これからはモーダルダイアログがメインフォームの後ろに移動することです。私は、ダイアログを構築するメッセージが何らかの理由でInvokeによって妨害されたときに起こると思います。TopMostとInvokeに関するZオーダーの問題

どのようにこの問題を解決するためのアイデアですか?

答えて

1

絶対にしてはいけない限り、TopMostは原則として避けてください。あなたが絶対にしてはならない場合は、一度に2つ以上のTopMostフォームを使用しないでください。 (結局のところ、TopMostフォームは3つありません---誰かが失うことになります)。

まず、Form.ShowDialog()に電話したときに所有者を正しく設定していることを確認します。これにより、新しいフォームが適切な場所に表示される可能性が高まり、オールラウンドでアプリケーションの動作が改善されます。次に、いつでもTopMostウィンドウが1つしかないことを確認します。これらのことを組み合わせて失敗した場合は、間違いなくあなたの問題を引き起こす可能性があります。例:

// MainForm.cs -- Don't do this 
this.TopMost = true; 
childForm.TopMost = true; 
childForm.ShowDialog(/*no parent spec'd*/); 

何が起こりますか?メインフォームと子フォームの両方が最上位なので、そのうちの1つは失われます。 MainFormはchildFormを最上位に作成したときにアクティブでしたが、childFormには親がありません。多分、Windowsはデスクトップをその親にすることに決めました。これにより、メインフォームが新しく開いた子フォームにとどまる可能性があります。

+0

ShowDialog(parentHandle)は私が今話す限り私の問題を解決しました。しかし、別の質問が発生します:なぜそこにはShowDialog(/ *親のspec'd * /)はありません。それは100の原因のうち99でのみ動作しますか?この種のバグは本当に1つのナッツを動かすことができます。私は、コーディングUIが統計の分野にコーダーをもたらすとは決して考えませんでした。 :) – Matze

+0

良い質問、私は答えを知りません。ベスト推測は "http://preview.tinyurl.com/c6cfze"に関連しています。基になるAPIは何らかの理由でNULLの親ウィンドウを許可します(多分何らかのコンテキストではShowDialog()が親を持つことはできません)。 –

0

たぶん、あなたはShowDialogを、のようなもの(VBの構文)にパラメータとして所有しているフォームを渡してみてください:...それは何も変更するかどう

Form.ShowDialog(Me) 

わからないが、試してみる価値

また、「フォームがTopMostに設定されています」と言うときは、メインフォームまたはモーダルフォームを意味しますか?本当にTopMostに設定する必要がありますか?ときどきTopMostフォームには奇妙な振る舞いがあります...

関連する問題