.NETのForm.LayoutMdi(MdiLayout)更新ポイント|WinForms MDI配置の影響範囲と確認事項

.NET の Form.LayoutMdi(MdiLayout) は、Windows Forms の MDI 親フォーム内で、開いている MDI 子フォームを「重ねて表示」「水平に並べる」「垂直に並べる」「アイコン整列」するためのメソッドです。2026年7月1日時点で確認すべき結論は、LayoutMdi 自体にアプリ設定変更や専用の移行期限が追加されたというより、既存の WinForms MDI アプリで「どのフォームが対象になるのか」「どの .NET バージョンで運用しているのか」「移行・保守時にレイアウト崩れをどう検証するのか」を整理することが重要だという点です。公式ドキュメントでも、このメソッドは System.Windows.Forms.Form に属し、MDI 親フォーム内の MDI 子フォームを配置する API として説明されています。(Microsoft Learn)

目次

.NET の Form.LayoutMdi(MdiLayout) Method とは

Form.LayoutMdi(MdiLayout) は、Windows Forms アプリケーションで複数の子ウィンドウを 1 つの親フォーム内に表示する MDI、つまり Multiple Document Interface を使っている場合に利用します。典型的には、販売管理システム、在庫管理システム、CAD、業務用エディターのように、1 つのメイン画面の中で複数の入力画面や参照画面を同時に開くアプリで使われます。

公式 API リファレンスでは、名前空間は System.Windows.Forms、アセンブリは System.Windows.Forms.dll、シグネチャは public void LayoutMdi(System.Windows.Forms.MdiLayout value) とされています。引数 value には、MDI 子フォームの配置方法を示す MdiLayout 列挙値を指定します。(Microsoft Learn)

このメソッドの役割は、フォームの中身のコントロール配置を変更することではありません。対象になるのは、MDI 親フォームの中に開かれている MDI 子フォームのウィンドウ位置です。たとえば、子フォーム内の TextBox や DataGridView を整列する API ではなく、CustomerForm、OrderForm、ReportForm のような子フォームそのものを親フォーム内で並べ直す API です。

2026年7月1日時点の更新ポイント

今回の Form.LayoutMdi(MdiLayout) で管理者や開発者が押さえるべき更新ポイントは、「新しい操作が増えた」と考えるよりも、「MDI を使う既存 WinForms アプリの保守観点を再確認する」と捉えるのが実務的です。

確認項目実務上の意味
API の役割MDI 親フォーム内の MDI 子フォームを配置する
影響するアプリWindows Forms で MDI を使っているデスクトップアプリ
影響しないアプリWPF、ASP.NET、MAUI、通常の単一フォーム構成の WinForms アプリ
設定変更LayoutMdi 専用の管理ポリシーやテナント設定は不要
移行期限LayoutMdi 固有の期限ではなく、利用中の .NET ランタイムや .NET Framework のサポート期限を確認する
優先対応対象コードの棚卸し、サポート対象 .NET への更新計画、MDI 画面の回帰テスト

公式ドキュメントでは、LayoutMdi は現在開いている子フォームを配置する例として、Window メニューのイベントハンドラーから MdiLayout.TileHorizontal、MdiLayout.TileVertical、MdiLayout.Cascade を呼び出す形が示されています。つまり、ユーザーが「ウィンドウ」メニューから表示方法を選ぶ業務アプリのような UI で特に使いやすいメソッドです。(Microsoft Learn)

MdiLayout の4つの指定値

LayoutMdi の動作は、引数に渡す MdiLayout 列挙値で決まります。公式の MdiLayout 列挙型には、Cascade、TileHorizontal、TileVertical、ArrangeIcons の 4 つが定義されています。(Microsoft Learn)

値使い方向いている場面
MdiLayout.Cascade子フォームを少しずつずらして重ねる複数画面のタイトルを見ながら切り替えたい
MdiLayout.TileHorizontal子フォームを水平方向に並べる上下方向に複数画面を比較したい
MdiLayout.TileVertical子フォームを垂直方向に並べる左右に並べて明細や一覧を比較したい
MdiLayout.ArrangeIcons最小化された MDI 子フォームのアイコンを整列する多数の子フォームを最小化している運用を整理したい

注意したいのは、TileHorizontal と TileVertical は「子フォーム内のコントロール」を並べるものではない点です。あくまで MDI 親フォームのクライアント領域内で、MDI 子ウィンドウの配置を変えるための値です。

基本的な実装例

LayoutMdi は、MDI 親フォーム側から呼び出すのが基本です。子フォームを作成し、MdiParent に親フォームを設定してから Show() し、その後で LayoutMdi を呼び出すと、表示済みの子フォームをまとめて配置できます。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        // このフォームを MDI 親フォームにする
        IsMdiContainer = true;
    }

    private void OpenCustomerForm()
    {
        var child = new CustomerForm
        {
            MdiParent = this,
            Text = "Customer"
        };

        child.Show();

        // 開いている MDI 子フォームを重ねて表示する
        LayoutMdi(MdiLayout.Cascade);
    }

    private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.Cascade);
    }

    private void tileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.TileHorizontal);
    }

    private void tileVerticalToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.TileVertical);
    }

    private void arrangeIconsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.ArrangeIcons);
    }
}

MDI 子フォームを作るには、子フォームの MdiParent プロパティに MDI 親フォームを割り当てます。公式ドキュメントでも、MdiParent を設定して子フォームを MDI 子フォームとして表示する例が示されています。(Microsoft Learn)

実務では、次のように共通メソッド化しておくと、子フォームがない場合や、MDI 親フォームではないフォームから誤って呼び出した場合の影響を抑えられます。

private void ApplyMdiLayout(MdiLayout layout)
{
    if (!IsMdiContainer)
    {
        return;
    }

    if (MdiChildren.Length == 0)
    {
        return;
    }

    LayoutMdi(layout);
}

MdiChildren は、MDI 親フォーム内で現在開いている MDI 子フォームへの参照を取得するためのプロパティです。子フォームをまとめて処理する場面、たとえば親フォーム終了時に各子フォームの状態を保存するような場面でも使えます。(Microsoft Learn)

影響範囲:どのアプリが確認対象になるか

Form.LayoutMdi(MdiLayout) の確認対象は、Windows Forms で MDI 構成を採用しているデスクトップアプリです。特に、長年運用している .NET Framework 製の業務アプリを .NET 8、.NET 9、.NET 10 などへ移行している場合は、画面遷移だけでなく MDI 子フォームの整列動作も回帰テストに含めるべきです。

対象になりやすいコードは、次のようなキーワードで検索できます。

LayoutMdi(
MdiLayout.
IsMdiContainer
MdiParent
MdiChildren

一方で、通常のモーダルダイアログ、ShowDialog() で表示する設定画面、Owner で所有関係を持たせた通常フォーム、WPF の Window、ASP.NET の Web 画面は LayoutMdi の対象外です。Windows Forms を .NET の SDK スタイルプロジェクトで使う場合は、Windows 固有のターゲットフレームワークと UseWindowsForms の設定が必要になります。(Microsoft Learn)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net10.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
</Project>

設定変更:LayoutMdi 専用の管理設定は不要

LayoutMdi はアプリケーションコード内で呼び出す Windows Forms API です。そのため、Microsoft 365 管理センター、Azure Portal、グループポリシー、Intune などで LayoutMdi 専用の設定を変更する必要はありません。

ただし、移行や再ビルドを行う場合は、プロジェクト側の設定確認が必要です。特に .NET Framework から現在の .NET へ移行する場合、TargetFramework が net8.0-windows や net10.0-windows のように Windows ターゲットになっているか、UseWindowsForms が true になっているかを確認してください。公式の MSBuild リファレンスでも、WinForms を使用する場合は Windows 固有のターゲットフレームワークと UseWindowsForms の設定が示されています。(Microsoft Learn)

確認箇所確認内容よくあるミス
.csprojTargetFramework が netX.0-windows になっているかnet10.0 のままで WinForms 参照が解決できない
.csprojUseWindowsForms が true かライブラリ移行時に WinForms 参照が外れる
親フォームIsMdiContainer = true か子フォームを作っても MDI 領域に入らない
子フォーム作成処理MdiParent = this を設定しているか通常のトップレベルフォームとして開いてしまう
メニュー処理親フォーム側で LayoutMdi を呼んでいるか子フォーム側から呼んで対象がずれる

移行期限:LayoutMdi 固有ではなく .NET のサポート期限を見る

Form.LayoutMdi(MdiLayout) に専用の移行期限が設定されているわけではありません。実務で確認すべきなのは、アプリがどの .NET ランタイムまたは .NET Framework 上で動いているかです。

2026年7月時点での計画では、.NET 10 は 2028年11月14日まで、.NET 9 と .NET 8 は 2026年11月10日までサポート対象です。Microsoft のサポートポリシーでは、.NET 10、.NET 9、.NET 8 のサポート終了日と最新パッチ情報が公開されています。(Microsoft Learn)

利用中の基盤管理者が取るべき判断
.NET 10長期運用の標準候補。新規移行先として検討しやすい
.NET 92026年11月10日のサポート終了を見据え、.NET 10 への移行計画を立てる
.NET 8LTS だが 2026年11月10日にサポート終了予定。延命前提にしない
.NET Framework 4.8 / 4.8.1既存 Windows デスクトップアプリでは継続利用も可能。ただし OS ライフサイクルと合わせて管理する
.NET Framework 4.6.22027年1月12日のサポート終了を踏まえ、更新計画を急ぐ
.NET Framework 4.6.1 以前すでにサポート終了済みのバージョンが含まれるため、優先的に棚卸しする

.NET Framework については、4.8.1、4.8、4.7.2 などが Active とされる一方、4.6.2 は 2027年1月12日にサポート終了予定、4.6.1、4.6、4.5.2 は 2022年4月26日にサポート終了済みです。(Microsoft)

移行時に起きやすいレイアウト問題

LayoutMdi はシンプルな API ですが、MDI アプリは古い業務アプリで使われていることが多く、移行時に「コンパイルは通るが画面の使い勝手が変わる」問題が起きやすい領域です。

症状主な原因対応
LayoutMdi を呼んでも何も変わらない対象フォームが MDI 子フォームではない子フォームの MdiParent 設定を確認する
子フォームが親フォーム外に開くMdiParent を設定していないchild.MdiParent = this; を Show() 前に設定する
並べ替え対象に一部の画面が含まれない通常フォームと MDI 子フォームが混在しているMdiChildren で対象を確認する
起動直後の整列が期待通りでない子フォーム表示前に LayoutMdi を呼んでいるShow() 後、または子フォーム作成完了後に呼び出す
多数の子フォームで使いにくいMDI の画面数が多すぎるタブ化、一覧メニュー、検索機能の追加を検討する
.NET 移行後に余白やサイズ感が変わるフォント、DPI、テーマ、デザイナー差異代表的な解像度・DPI で画面確認する

特に注意したいのは、LayoutMdi が「現在開いている MDI 子フォーム」を配置するメソッドである点です。子フォームを作成する前や、別スレッドで非同期処理中に安易に呼び出すのではなく、表示タイミングと UI スレッド上の操作を意識して実装してください。

管理者が確認すべきポイント

グローバル展開している業務アプリでは、LayoutMdi のような UI API であっても、単に開発者だけの問題として扱わない方が安全です。地域ごとに Windows の表示言語、DPI、モニター構成、リモートデスクトップ環境、配布されている .NET ランタイムが異なるため、同じ WinForms アプリでも画面の見え方が変わる可能性があります。

管理者は、少なくとも次の 4 点を確認してください。

確認ポイント理由
対象アプリの棚卸しMDI を使っている古い WinForms アプリを把握するため
.NET バージョンの確認サポート終了が近い .NET 8 / .NET 9 や古い .NET Framework を見逃さないため
配布方式の確認ClickOnce、MSI、Intune、社内配布ツールなどでランタイム差異を防ぐため
画面回帰テストフォーム整列、最小化、最大化、複数モニター、DPI の問題を検出するため

.NET のアップグレードは、サポート終了、セキュリティ要件、依存関係、パフォーマンス上の制約がある場合に検討すべき作業です。Microsoft の移行ガイダンスでも、依存関係の評価、アップグレードパスの選択、検証を含めて計画することが推奨されています。(Microsoft Learn)

開発チーム向けの確認手順

既存アプリで Form.LayoutMdi(MdiLayout) を使っているか確認する場合は、次の順で進めると効率的です。

手順作業内容成果物
1ソリューション全体で LayoutMdi( を検索する呼び出し箇所一覧
2IsMdiContainer と MdiParent の設定箇所を確認するMDI 親子関係の整理表
3対象プロジェクトの .csproj を確認する対象 .NET バージョン、WinForms 設定
4子フォーム数が多い業務画面を洗い出す優先テスト対象
5Cascade、TileHorizontal、TileVertical、ArrangeIcons を実機で確認するレイアウト回帰テスト結果
6.NET 8 / .NET 9 利用中なら .NET 10 移行計画を作るサポート期限対応計画

コードレビューでは、LayoutMdi の呼び出し自体よりも、「本当に MDI が必要か」「子フォームの生成・破棄が適切か」「多数のウィンドウを開く運用が現場で使いやすいか」を確認することが重要です。古い MDI アプリをそのまま移行すると、ランタイムは新しくなっても UI の使いにくさが残るためです。

使い続けるべきか、見直すべきかの判断基準

Form.LayoutMdi(MdiLayout) は、既存 MDI アプリの保守では今でも有効です。ただし、新規開発で積極的に MDI を採用するかは慎重に判断してください。

判断向いているケース
使い続ける既存業務アプリが MDI 前提で、ユーザーが複数画面を同時操作している
改善して使う子フォーム数が多く、Window メニューや検索、整列機能を強化すれば運用しやすくなる
見直す画面が増えすぎてユーザーが迷う、タブ UI や一覧遷移の方が分かりやすい
移行時に再設計する.NET Framework から .NET 10 へ移るタイミングで UI/UX も改善したい

MDI は「1 つの親画面で複数画面を扱える」便利な仕組みですが、フォーム数が増えるほど操作が複雑になります。LayoutMdi は、その複雑さを完全に解決する API ではなく、開いている子フォームを整理するための補助機能と考えると判断を誤りにくくなります。

まず対応すべきこと

Form.LayoutMdi(MdiLayout) の更新ポイントとして最初に行うべきことは、コードを書き換えることではありません。まず、対象アプリが MDI を使っているか、どの .NET バージョンで動いているか、サポート期限に問題がないかを確認してください。

既存の MDI アプリを運用している場合は、LayoutMdi の呼び出し箇所、MdiParent の設定、IsMdiContainer の設定、MdiChildren の扱いを棚卸しします。そのうえで、.NET 8 または .NET 9 を使っているなら、2026年11月10日のサポート終了を見据えて .NET 10 への移行計画を検討します。LayoutMdi 自体の使い方は大きく変わりませんが、移行時の画面回帰テストに含めることで、業務画面のレイアウト崩れや操作性低下を事前に防げます。(Microsoft Learn)

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次