4

次のコードでは、Form1他の 2 つの を開きForm、そのうちの 1 つを閉じます。その結果、2 番目の子フォームも閉じられます。なんで?

public partial class Form1 : Form
{
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 };

    public Form1()
    {
        InitializeComponent();
        ShowForm3();
        (new Form2()).ShowDialog();//If this is changed to 'Show' - it doesn't get closed.
    }

    void ShowForm3()
    {
        Form3 f3 = new Form3();
        f3.Show();
        timer.Tick += (sender, e) => f3.Close();
        timer.Start();
    }
}

Form2およびForm3デフォルトの VS フォームです。

(さらに: これは元のコードの単純なバージョンです。元のコード (もちろん、ここに投稿するには長すぎます) では、これは Visual Studio (デバッグでもリリースでもない) から実行された場合には発生しません。 clickonce アプリケーションとしてインストールされ、実行可能ファイル (AppData フォルダーの下) をクリックしただけでも (おそらく、VS から実行されたときにそれが発生しないようにするコードが他にあるかもしれませんが、何が見つかりませんでしたか? ) その不一致の原因は何でしょうか? おそらく、通常のリリース モードでは行われない、clickonce でのある種の最適化ですか?)

4

1 に答える 1

5

コードを次のように変更します。

  public partial class Form1 : Form
  {
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 };

    public Form1()
    {
        InitializeComponent();
        ShowForm3();
        (new Form2()).ShowDialog(this);
    }

    void ShowForm3()
    {
        Form3 f3 = new Form3();
        f3.Show();
        timer.Tick += (sender, e) => f3.Close();
        timer.Start();
    }
  }

説明: フォームの親を渡さなかった場合、ウィンドウは次のメソッドを使用して親としてアクティブなウィンドウになります: GetActiveWindow何が起こったのか:

when call form2.showDialog() // 親ウィンドウはフォーム 3 です。これは、メソッド GetActiveWindow が表示中のウィンドウを取得し、form1 がアクティブまたは表示中ではないためです。

親を強制するとき: form2.showDialog(this) を呼び出すとき // 親ウィンドウは、fixed を定義したためフォーム 1 です

于 2013-08-22T18:16:39.057 に答える