0

Form.ShowDialog() でダイアログを表示しています。フォームは TopMost に設定されています。一部の画像処理計算は、バックグラウンドで非同期に実行されます。それらの結果は、Invoke によってメイン フォームにレンダリングされます。ここまでは順調ですね。奇妙なことは、時々モーダル ダイアログがメイン フォームの後ろに移動することです。ダイアログを構築するメッセージが Invoke によって何らかの形で「邪魔された」場合に発生すると思います。

この問題を解決する方法はありますか?

4

2 に答える 2

1

原則として、絶対にそうしてはいけない場合を除いて、TopMostは避けてください。どうしてもいけない場合は、一度に複数のTopMostフォームを使用しないでください。(結局のところ、3つのTopMostフォームはあり得ません---誰かが失う必要があります)。

まず、を呼び出すときに所有者を正しく設定していることを確認しますForm.ShowDialog()。これにより、新しいフォームが適切な場所に表示される可能性が高くなり、アプリケーションの動作が全体的に改善されます。次に、常にTopMostウィンドウが1つしかないことを確認します。これらのことを組み合わせて失敗すると、間違いなく問題が発生する可能性があります。例えば:

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

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

于 2009-04-08T04:18:39.320 に答える
0

たぶん、所有しているフォームをパラメータとして ShowDialog に渡してみてください (VB 構文):

Form.ShowDialog(Me)

何かが変わるかどうかはわかりませんが、試してみる価値はあります...

また、「フォームが TopMost に設定されている」とは、メイン フォームのことですか、それともモーダル フォームのことですか。本当に TopMost に設定する必要がありますか? TopMost フォームの動作がおかしくなることがあります...

于 2009-04-08T04:05:12.940 に答える