【C#】【Form】画面遷移を考える ~ ApplicationContext ~

■ はじめに

Form内での画面遷移において、以下のように画面を切り替える方法を考える
~~~~
Form1 => Form2 => Form3
~~~~

以下のようにForm1をメインに指定して、
Form1からForm2 に遷移した際に、Form1をCloseした場合、
プロセスは切れるので、Form2も自動的に消えてしまう
~~~~
static void Main()
{
  ...
  Application.Run(new Form1());
}
~~~~

Form1を消した場合でも画面遷移できる方法を考える

■ 画面遷移の実装案

色々な方法があると思うし、どうとでもできると思うが...

【1】UserControlで実装する
【2】メイン画面を非表示にして切り替える
【3】ApplicationContext を利用して切り替える << 今回のテーマ

etc...

【1】UserControlで実装する

http://punyo-er-met.hateblo.jp/entry/2016/04/10/103632
の通り、メイン画面を設けて、
複数のUserControlを表示・非表示を切り替える

ユーザコントロールについては、以下の関連記事を参照。
UserControl (ユーザコントロール)
https://blogs.yahoo.co.jp/dk521123/21165720.html

【2】メイン画面を非表示にして切り替える

 * 以下のように、メイン画面を非表示にして切り替える
 * これ以外にも、メイン画面をダミー・非表示にし司令塔として
   画面を切り替えるなど色々できる

サンプル

private void button1_Click(object sender, EventArgs e)
{
  var form2 = new Form2();
  form2.Show();

  this.Hide();
}

【3】ApplicationContext を利用して切り替える

サンプル

Program.cs
using System;
using System.Windows.Forms;

namespace SampleForm
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new DemoApplicationContext());
    }
  }

  // ★ここ★
  public class DemoApplicationContext : ApplicationContext
  {

    public DemoApplicationContext()
    {
      this.MainForm = new Form1(this);
    }

    // ★画面遷移処理★
    public void SwitchForm(Form nextForm)
    {
      var perviousForm = this.MainForm;
      this.MainForm = nextForm;

      perviousForm.Close();
      nextForm.Show();
    }
  }
}
Form1.cs
using System;
using System.Windows.Forms;

namespace SampleForm
{
  public partial class Form1 : Form
  {
    private DemoApplicationContext context;

    public Form1(DemoApplicationContext applicationContext)
    {
      InitializeComponent();

      this.context = applicationContext;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      this.context.SwitchForm(new Form2(this.context));
    }
  }
}
Form2.cs
 * Form1とほとんど同じなので省略

関連記事

Windows Form ~ 目次 ~

https://blogs.yahoo.co.jp/dk521123/8054245.html

UserControl (ユーザコントロール)

https://blogs.yahoo.co.jp/dk521123/21165720.html

タスクトレイにある常駐アプリの作成

https://blogs.yahoo.co.jp/dk521123/37858885.html

MVVM / MVPVM / MVW / PAC パターン

https://blogs.yahoo.co.jp/dk521123/22001152.html