1

概要:私がやろうとしていることをすべて説明するコード (2 つの関数) と、私の問題を示す図

アプリケーションで新しい子フォームを開く必要があるときはいつでも。私は次の関数を呼び出すために使用します。(子フォームは別の子を持つことができます)

    public void openNextForm(Form f1, Form f2)
    {
        f2.Owner = f1;                  
        f2.WindowState = FormWindowState.Maximized;
        f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
        f1.Hide();
        f2.ShowDialog();
    }



    // When I close a child form by clicking cross or with ALT-F4
    void f_FormClosing(object sender, FormClosingEventArgs e)
    {
        Form f = sender as Form;
        f.Owner.Show();
    }

子フォームを閉じると、所有者/親フォームを表示するために使用します。正常に動作しています。

ただし、場合によっては、所有者フォームの一部のコントロール (ボタン) が、子フォームを閉じるときに表示されると非表示になります。

ここに画像の説明を入力

しかし、このフォームの実際の状態はここに画像の説明を入力

複雑で長いコード化された子フォームから戻る場合にのみ、この動作に直面する必要があります(この場合でも、いつかは正常に動作します)。単純な (小さなコード化された) 子フォームの場合、動作は正常です。

挙動不審なフォームでaltキーを押すと、驚くほど元の状態で表示される

私はこの問題を探してみましたが、似たようなものをたくさん見つけましたが、私が見ることができる最も近いものは次のとおりでしたが、それでもshowdialogの場合はまったく役に立ちません

C# フォームの問題: 新しいフォームが制御を失い、ランダムに非表示になる

上記のリンクから次のコードを使用する場合、子フォームを開いてから子フォームを開くたびに。すべてのフォームが非表示になります。そのため、うまく機能していません。

    public void openNextForm(Form f1, Form f2)
    {
        f2.Owner = f1;            
        f2.Show();
        f1.Hide();
        f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
    }

タブを使用することは解決策になるはずですが、閉じる/非表示にする/表示するときに、フォームを個別に保持し、すべてのケースで一貫した動作を維持したい

4

1 に答える 1

1

問題が解決するかどうかはわかりませんが、トリックを実行できるいくつかの改善が見られます。

動作確認はできませんのでご了承ください。

   

public void openNextForm(Form f1, Form f2)
    {
        // we don't need ownership since f1 is hidden.                
        // f2.Owner = f1; 
        f2.WindowState = FormWindowState.Maximized;
        // we don't need this event handled since we use ShowDialog
        //f2.FormClosing += new FormClosingEventHandler(f_FormClosing);
        // The following should hide f1 after f2 is displayed even when using dialog
        f2.Shown += (s, e) => {
            f1.Hide();
        };
        f2.ShowDialog();
        f1.Show();
    }
于 2012-09-08T20:33:16.647 に答える