0

私には2つのフォームがあります。1 つ目は親で、2 つ目とボタンへの参照が含まれています。

public class Form1:Form {

       private Form2 frm2;
       private Button btnShow;
...

}

ボタンを押すと、frm2 が表示され (他のすべてのウィンドウの前に表示され)、Form1 が非表示になる必要があります。

frm2 のクローズボックスを押すと、frm2 が非表示になり、Form1 が表示される (反転) 必要があります。

btnShow のクリック イベントを使用してハンドルを登録しました。

    private void click(object sender, EventArgs e)
    {
        Hide();
        frm2.Show(this);
    }

および frm2 の FormClosing イベントで:

    private void byebye(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            Hide();
            Owner.Show();
        }
    }

私のコードは 90% の時間機能しますが、(いつ指定できないか) 表示されたフォームが前面に表示されないか、フォーカスが失われることがあります (最初に考えたことについてはわかりません)。

私が間違っていること。Show と Hide の順序を交互に変更し、Owner の代わりに新しい参照を使用しようとしましたが、Activate、BringToFront、Focus も使用しましたが、成功しませんでした...

4

2 に答える 2

2

なぜ単純ではないのですか:

{
    Form2 fm = new Form2();
    this.Visible = false;
    fm.ShowDialog();
    this.Visible = true;
}

私のために働きます。

于 2013-03-03T16:43:00.287 に答える
1
    Hide();
    Owner.Show();

あなたはこれを間違った方法でやっています。一瞬、フォーカスを受け取ることができる単一のウィンドウがアプリケーションに残っていません。Windows ウィンドウ マネージャーは、フォーカスを与える別のウィンドウを探す必要があります。別のアプリケーションのウィンドウになります。これは、自分自身をカバーするのに十分な大きさのウィンドウである可能性が高い. Show() を呼び出すと、ウィンドウが再び表示されますが、フォアグラウンドに移動したウィンドウの下になります。これは常に発生するとは限りません。ウィンドウ マネージャーは短いタイムアウトを使用しているようです。所有者が隠されている時間が長ければ長いほど、そのコードがスワップアウトされ、それを表示するのに時間がかかり、タイムアウトが発生する可能性が高くなります。

回避策は簡単です。2 つのステートメントを交換するだけで、常にフォーカスできるウィンドウが表示されます。修理:

    Owner.Show();
    Hide();
于 2013-03-03T17:05:11.547 に答える