0

私はメインフォームを持っています。私はメインフォームからフォーム2form2.ShowDialog(Application.OpenForms["MainForm"]); を呼び出し、次にフォーム2から別のフォームを呼び出します

    this.Hide();
    form3.ShowDialog(Application.OpenForms["MainForm"]);
    this.Dispose();

すべて正常に動作しますが、form3 が表示されると、背景に表示されているウィンドウを垣間見ることができます。自動的に背景に移動します。この動作はなぜですか?どうすれば修正できますか?

4

2 に答える 2

1

ダイアログを表示する前にメイン ウィンドウを非表示にしているので、その後ろにある別のウィンドウが一瞬だけ表示されます。あなたがしていることも非常に危険です。プログラムが焦点を失う可能性が非常に高いです。ダイアログを表示する前と特に表示した後の両方で、プログラムにはフォーカスを受け取ることができるウィンドウがありません。そのため、Windows ウィンドウ マネージャーはフォーカスを与える別のウィンドウを探す必要があり、別のアプリケーションのウィンドウを選択します。バックグラウンドであなたを強制し、そのウィンドウが十分に大きい場合は完全に非表示にします.

対策を講じる必要があります。Hide() 呼び出しを遅らせることで、メイン ウィンドウを非表示にすることができます。フォームの BeginInvoke() メソッドは、そのために非常に便利です。また、ダイアログを閉じる直前に、メイン ウィンドウが再び表示されるようにする必要があります。ダイアログの FormClosing イベントは、そのために便利です。OnFormClosing() をオーバーライドする代わりに、ダイアログが既にイベントをワイヤリングしている場合、100% 信頼できるわけではありません。

したがって:

    private void DisplayDialog_Click(object sender, EventArgs e) {
        using (var dlg = new Form2()) {
            this.BeginInvoke(new Action(() => this.Hide()));
            dlg.FormClosing += dlg_FormClosing;
            dlg.StartPosition = FormStartPosition.Manual;
            dlg.Location = this.Location;
            if (dlg.ShowDialog() == DialogResult.OK) {
                // etc..
            }
            dlg.FormClosing -= dlg_FormClosing;
        }
    }

    void dlg_FormClosing(object sender, FormClosingEventArgs e) {
        if (!e.Cancel) this.Show();
    }

または、メイン ウィンドウを非表示にしないでください。あまり便利ではありません。ダイアログは、モーダルであり、コピー/貼り付けを妨げているため、そのままでは十分に迷惑です。ユーザーがウィンドウを完全に見ることができないようにすると、ユーザーにとって役立つ可能性のある情報が隠されるだけです。

于 2012-06-30T13:02:10.010 に答える
1

を呼び出すとthis.Hide()、Form2 が非表示になり、別のウィンドウにフォーカスする必要があります。ただし、ShowDialog を使用して Form2 を開きました。つまり、アプリケーションでフォーカスできるウィンドウは Form2 だけです。しかし、Form2 を非表示にしたため、Windows はフォーカスする別のウィンドウ (この場合は MS ペイント) を見つけます。

解決策の 1 つの提案は、Form2 を非表示にする前に、人為的に MainForm にフォーカスを与えることです。

Application.OpenForms["MainForm"].Activate();
this.Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();

おそらく、より美しい解決策は、最初に Form3 を開き、それが表示されるのを待ってから、Form2 を非表示にすることです。これを行うには、Form3 を表示したいときに、このコードを Form2 に入れます。

form3.Shown += (_s, _e) => Application.OpenForms["Form2"].Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();
于 2012-06-30T12:41:33.410 に答える