.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)
| 確認箇所 | 確認内容 | よくあるミス |
|---|---|---|
.csproj | TargetFramework が netX.0-windows になっているか | net10.0 のままで WinForms 参照が解決できない |
.csproj | UseWindowsForms が 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 9 | 2026年11月10日のサポート終了を見据え、.NET 10 への移行計画を立てる |
| .NET 8 | LTS だが 2026年11月10日にサポート終了予定。延命前提にしない |
| .NET Framework 4.8 / 4.8.1 | 既存 Windows デスクトップアプリでは継続利用も可能。ただし OS ライフサイクルと合わせて管理する |
| .NET Framework 4.6.2 | 2027年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( を検索する | 呼び出し箇所一覧 |
| 2 | IsMdiContainer と MdiParent の設定箇所を確認する | MDI 親子関係の整理表 |
| 3 | 対象プロジェクトの .csproj を確認する | 対象 .NET バージョン、WinForms 設定 |
| 4 | 子フォーム数が多い業務画面を洗い出す | 優先テスト対象 |
| 5 | Cascade、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)

コメント