Module の詳細・一覧・検索の各画面は、レイアウトの中に Field を配置して作ります。 3 種類のレイアウトを入れ子に組み合わせて画面を構成します。
| レイアウト | 特徴 | 主な用途 |
|---|---|---|
| Grid | 行 × 列のグリッドに配置(最も一般的) | 業務アプリの入力画面の基本 |
| Canvas | ピクセル座標で自由配置 | ダッシュボード・帳票風画面 |
| Tab | 複数の内容をタブで切替 | 画面が長くなる時の分割 |
Module の Root 要素は Grid です。多くの場合 Grid を基本にして、必要に応じて Canvas・Tab・入れ子の Grid を組み合わせます。
補足: Grid の
IsFlowLayoutをオンにすると「行・列構造を無視して横一列に並べて折り返す Flow モード」になります。タグ列・ボタンバーなどに使います。詳細は Wrap 系の使い分け を参照。
すべてのレイアウト(Grid / Canvas / Tab)で使えるプロパティ:
| プロパティ | 説明 |
|---|---|
| Name | レイアウトの識別子(スクリプトから参照する名前) |
| IsViewOnly | 読み取り専用 |
| BackgroundColor | 背景色(指定なしは親からカスケード) |
このほか、スクリプトからは IsEnabled / IsVisible / Color / FontFamily / FontSize も全レイアウト共通で操作できます(スクリプトから参照)。
行と列のグリッドに要素を配置します。入れ子が可能で、セルの中にさらに Grid や Canvas を入れられます。
列幅は以下の優先度で決まります(上から順に最初に該当したものが適用):
IsAutoFillWrap(Grid または Row) — CSS Grid のauto-fitで均等折り返し。MinWidth必須、カラム個別のWidth/MaxWidthは無効IsProportionalScale(Row) — 行内の各列のWidthを固定 px ではなく比率として扱い、行幅に合わせて列幅の比率を保ったまま拡大縮小(下記 参照)Width指定(固定幅) — カラムは正確に指定 px に固定MinWidth指定 — 均等に伸び、最小幅を保証。MaxWidthを併用すると伸びすぎ防止- センタリングパターン — 行が
[空 \| 中身 \| 空]の 3 列構成のとき、中身カラムはコンテンツ幅にフィット - 指定なし — 均等に伸びてコンテンツが幅を決める
| プロパティ | 用途 |
|---|---|
| Width | 固定幅(px)。IsProportionalScale 行では比率 |
| MinWidth | 最小幅。不足時に折り返す |
| MaxWidth | 最大幅(MinWidth と併用) |
| IsAutoFillWrap | 折り返し時に自動で均等割り(MinWidth 必須、MaxWidth は無効) |
| IsProportionalScale | 行単位。各列の Width を比率として拡大縮小 |
Row の 「列幅を比率で拡大縮小」(IsProportionalScale: true)を有効にすると、その行の各列の Width を比率として扱い、画面幅が変わっても列幅の比率を保ったまま行幅いっぱいに拡大縮小します。例えば Width を 100 / 200 / 100 と指定すると、実際の幅は常に行幅の 25% / 50% / 25% になります。
制約(デザインチェックで検証されます):
- 行内のすべての列に
Widthの指定が必須 MinWidth/MaxWidthは指定不可- 列のリサイズ(
CanResize)は使用不可 - 折り返し(
IsWrap/IsAutoFillWrap)、フローレイアウト(IsFlowLayout)とは併用不可
動くサンプルは標準パターン集の レイアウト/列幅を比率で拡大縮小 を参照してください。
Grid は標準でいくつかのマージン・パディングを持ち、要素間に適切なスペースが確保されています。
- Grid — 通常はなし。
IsBorderedオン時は内側に上下1rem/ 左右0.625remのパディング - Row — 上下それぞれに
1remのマージン - Column — 左右に
0.375remのパディング。BorderStyleを指定した Column はさらに上下0.5remのパディング
優先順位は 個別の Padding / Margin プロパティ > CSS 変数 > 既定値。
- 特定の 1 箇所だけ変えたいなら、その Grid・Row・Column の
Padding/Marginプロパティ - アプリ全体の既定値を変えたいなら、
app.cssで CSS 変数を上書き
CSS 変数名・既定値の一覧は カスタマイズ可能な CSS 変数 を参照してください。
| プロパティ | 説明 |
|---|---|
| Name | 識別子 |
| IsViewOnly | 読み取り専用 |
| IsBordered | 枠付き(カード)として描画。background-color は標準で透過 |
| UseBorderedShrinkWrap | IsBordered 併用時、カード幅を中身のコンテンツに合わせて縮める。左右に余白ができ、結果として画面中央寄せのカードになる |
| Padding | 内側のパディング(上下左右指定)。指定するとそのカード個別の値になり、CSS 変数より優先される |
| BackgroundColor | 背景色(指定なしは親からカスケード) |
| IsFillAvailable | このグリッドが root のとき、ページの残り高さを埋めるよう末尾 Normal 行を伸ばす(FillAvailable 参照) |
| ScrollDirection | スクロール方向。Unset / Vertical / Horizontal。Flags なので Vertical, Horizontal の組合せ指定で両方向スクロール可 |
| IsFlowLayout | 行・列構造を無視して横並び+折り返しのフロー配置(Wrap 系の使い分け 参照) |
| IsAutoFillWrap | 全行を CSS Grid auto-fit で均等折り返し(MinWidth 必須。Wrap 系の使い分け 参照) |
| OnKeyDown | このグリッド内でキーが押された時のスクリプト(OnKeyDown イベント 参照) |
| IsExpandable / ExpanderLabel / IsExpanderDefaultOpened | 折りたたみグリッド機能。IsExpandable で折りたたみ可能になり、ExpanderLabel でヘッダ文言、IsExpanderDefaultOpened で初期状態(開く / 閉じる)を指定 |
.cardの背景透過:IsBorderedをオンにすると Bootstrap の.cardクラスでレンダリングされますが、標準でbackground-color: transparentが当たっています。背景色を付けたい場合はBackgroundColorを明示的に設定してください。
| プロパティ | 説明 |
|---|---|
| Height | 行の高さ(px) |
| GridRowType | Normal / Header / Footer。IsFillAvailable のとき末尾の Normal 行が伸びる対象 |
| Margin | 行のマージン(上下左右) |
| BackgroundColor | 行全体の背景色 |
| CanResize | ユーザーによる行サイズ変更を許可 |
| IsWrap | 列が入りきらないときに折り返す |
| IsAutoFillWrap | この行だけ auto-fit で均等折り返しにする(MinWidth 必須) |
| IsProportionalScale | 列幅を比率で拡大縮小。各列の Width を比率として扱い、行幅に合わせてスケール(詳細) |
| プロパティ | 説明 |
|---|---|
| Width / MinWidth / MaxWidth | 幅指定(列幅の決定ルール参照) |
| Padding | カラム内のパディング(上下左右)。指定するとそのカラム個別の値になり、CSS 変数より優先される |
| BackgroundColor | カラムの背景色 |
| BorderStyle | 上下左右それぞれの罫線(太さ・色を辺ごとに指定)。指定すると --default-column-border-padding-top/bottom(既定 0.5rem)の上下パディングが追加される |
| HorizontalAlignment | 水平位置。Start / Center / End / Stretch(既定: Stretch) |
| VerticalAlignment | 垂直位置。Top / Middle / Bottom / Stretch(既定: Stretch) |
| CanResize | ユーザーによる列サイズ変更を許可 |
横アライメントの副作用:
Stretch以外(Start/Center/End)にすると、中身がカラム幅にフィットせずコンテンツの固有幅になります。長いテキストはカラム幅をはみ出す可能性があるので注意してください。
ピクセル座標で自由に要素を配置します。デザイナ上でドラッグ&ドロップでサイズと位置を決めます。
| プロパティ | 説明 |
|---|---|
| Name | 識別子 |
| IsViewOnly | 読み取り専用 |
| IsBordered | 枠を描画 |
| BackgroundColor | 背景色 |
| ScrollDirection | スクロール方向。Unset / Vertical / Horizontal |
| プロパティ | 説明 |
|---|---|
| Left / Top | 配置座標(px) |
| Width / Height | サイズ(px) |
| ZIndex | 重なり順 |
Element 自体には
Nameがないため、スクリプトから個別の Element を直接操作することはできません。Element の中に置いた Layout(Grid / Canvas / Tab)のNameを介して操作してください。
複数のレイアウトをタブで切替表示します。情報量の多い画面の分割に便利です。
| プロパティ | 説明 |
|---|---|
| Name | 識別子 |
| Tabs | タブヘッダのラベル一覧(順番がタブの並び順) |
| Padding | タブパネル内側のパディング。指定すると CSS 変数(--default-tab-padding-*、既定 上下 0.625rem / 左右 1rem)より優先される |
| IsBordered | タブパネルを枠付きで描画 |
| Color | タブヘッダ(非選択タブ)の文字色 |
| SelectedColor | 選択中タブの文字色 |
| BackgroundColor | 背景色 |
| IsViewOnly | 読み取り専用 |
| OnSelectedIndexChanged | タブ切替「後」のスクリプト |
| OnSelectedIndexChanging | タブ切替「前」のスクリプト。bool を返し、false で切替キャンセル |
各タブの中身(Layouts)には Grid / Canvas / Tab をそれぞれ配置できます。
// 現在選択中のタブインデックス(0 始まり)
var idx = MyTabs.SelectedIndex;
// プログラム的に切替
MyTabs.SelectedIndex = 2;
// 切替前バリデーション
bool MyTabs_OnSelectedIndexChanging(int index)
{
if (index == 2 && string.IsNullOrEmpty(NameField.Value))
{
Toaster.Warn("名前を入力してください");
return false; // 切替キャンセル
}
return true;
}検索画面で使う Grid は SearchGridLayout という派生型で、条件結合の演算子を持ちます。
| プロパティ | 説明 |
|---|---|
| Operator | 子条件の結合方法。And / Or / UserSpecified(画面上でユーザーに選ばせる) |
入れ子の SearchGridLayout で複雑な条件式(A AND (B OR C) 等)を組み立てます。詳細は モジュール検索設定 を参照。
折り返しまわりは似た名前のプロパティが複数あります。違いを整理します。
| プロパティ | 適用範囲 | 挙動 |
|---|---|---|
IsWrap |
Row | カラムが入りきらないとき、行内で折り返す |
IsAutoFillWrap |
Grid または Row | CSS Grid auto-fit で均等幅にして折り返す(MinWidth 必須) |
IsFlowLayout |
Grid | 行・列の構造を完全に無視して横並び+折り返しのフロー配置にする |
| やりたいこと | 推奨 |
|---|---|
| 入力フォームで横が狭くなったら折り返したい | Row の IsWrap |
| カードを画面幅に応じて 2 列・3 列・4 列と均等に並べたい | Grid または Row の IsAutoFillWrap + MinWidth |
| タグ・アイコン列・ボタンバーで自然に流したい | Grid の IsFlowLayout |
Grid の IsFillAvailable をオンにすると、そのグリッドが Module の root のとき、ページの残り領域を埋める高さまで末尾の Normal 行が伸びます。
- 対象は
GridRowType = Normalの行のうち最後のもの。Header/Footerの行は対象外 - ListField を画面いっぱいの高さで表示したい場面でよく使います
各レイアウトはセル / Element / タブの中に別のレイアウトを入れられます。
- Grid のセル → Grid / Canvas / Tab
- Canvas の Element → Grid / Canvas / Tab
- Tab の各タブ → Grid / Canvas / Tab
これにより「上半分は Grid で入力フォーム、下半分は Tab で関連情報」のような複雑な画面構成が可能です。
Grid の OnKeyDown プロパティにスクリプトを設定すると、そのグリッド内でキーが押された時に呼び出されます。Enter / Escape / Ctrl+S 等のキー操作に応じた処理を書けます。
void GridLayoutDesign_OnKeyDown(KeyboardEventArgs e)
{
if (e.Key == "Enter")
{
// 何か処理
}
}| プロパティ | 説明 |
|---|---|
Key |
押されたキー文字列。"Enter" / "Escape" / "a" / "ArrowUp" 等 |
Code |
物理キーコード |
CtrlKey / ShiftKey / AltKey / MetaKey |
修飾キー押下状態 |
Repeat |
長押しによるリピートか |
日本語入力(IME)で変換中に押される Enter キー(変換確定)等は OnKeyDown には届きません。フレームワーク側で IME 変換中のキー入力を除外しているため、変換確定の Enter で意図せず処理が走る心配は不要です。
入力中のフィールド(TextField 等)にフォーカスがある状態で Enter を押した場合、OnKeyDown が呼ばれた瞬間はまだ Field の Value に値が反映されていません。これはブラウザの仕様で、入力ボックスの値は keydown イベントの後に確定するためです。
確定後の値を見たい場合は、ハンドラの先頭で Task.Delay(1) を呼んでください。
void GridLayoutDesign_OnKeyDown(KeyboardEventArgs e)
{
if (e.Key == "Enter")
{
Task.Delay(1); // ブラウザの値確定処理が走るのを待つ
Toaster.Success(NameField.Value); // ここでは反映済み
}
}ブラウザはキー入力をおおよそ次の順で処理します:
keydown← OnKeyDown が呼ばれる(この時点では Value 未確定)- (内部処理)入力ボックスの値を確定 → Field の Value に反映
keyup
Task.Delay(1) は「1 ミリ秒後にスクリプトの続きを実行」という意味ですが、その 1 ミリ秒の間にブラウザが上記 2 番の値確定処理を行います。続きの処理が走る時点では Value が最新の状態になっているため、自然に最新値が読めます。
Task.Delay(0) でも動作する場合がありますが、Task.Delay(1) の方が確実です。
ボタンに焦点が当たっている、画面のどこも入力中でない、といった状態で Enter を押した場合は、Value は既に確定済みです。Task.Delay(1) は不要で、いきなり値を読んで構いません。
「入力中のフィールド」かどうかは Field.HasFocus() で判定できます。
void GridLayoutDesign_OnKeyDown(KeyboardEventArgs e)
{
if (e.Key != "Enter") return;
// 入力中なら値確定を待つ
if (NameField.HasFocus())
{
Task.Delay(1);
}
Toaster.Success(NameField.Value);
}レイアウトに配置した Field は、Field 本来のプロパティのほかに配置場所固有のプロパティを持ちます。
| プロパティ | 説明 |
|---|---|
| ClassName | 任意の CSS クラス名を付与(独自スタイル用)。詳細は css.md |
| ContextMenu | 右クリック時に表示する ContextMenuField を Field 名で指定 |
| FontFamily / FontSize | フォント指定(指定なしは親からカスケード) |
| FontWeight / FontStyle | フォントウェイト・スタイル(カスケード対象外、明示指定したフィールドにだけ適用される) |
| Color | 文字色(指定なしは親からカスケード) |
同じ Field を別レイアウトに配置すると、レイアウト個別プロパティは配置ごとに別々に持てます(例: 一覧では小さく、詳細では大きく表示)。
Color / BackgroundColor / FontFamily / FontSize の 4 つだけが、明示的に指定しない場合、親レイアウトから値を引き継ぎます。FontWeight / FontStyle は親に値があっても継承しません — 明示的に指定したフィールドにだけ適用されます。
Module (詳細レイアウトの Color/Font 設定)
└── Grid (未指定 → Module から継承)
└── Row → Column
└── Field (未指定 → 上位レイアウトから継承)
このため、Module の詳細レイアウトのプロパティで全体のフォントサイズを変えれば、内側の全 Field に伝わります。個別に変えたい箇所だけ Field 配置側で上書きします。
デザイナ上の表示は、ブラウザ上の表示と完全には一致しません。最終的な表示はデプロイ後に Web ブラウザで確認してください。
特に次の項目はデザイナ上で実際の見た目と乖離しやすいです:
IsFillAvailableの伸び(実際のブラウザ高さに依存)IsFlowLayout/IsAutoFillWrapの折り返し(ブラウザ幅に依存)- カスケードした Color / Font の表示
| プロパティ | 型 | 説明 |
|---|---|---|
Name |
string | レイアウト名 |
LayoutName |
string | 親モジュールの現在のレイアウト名 |
ModuleLayoutType |
ModuleLayoutType | None / Detail / List / Search(通常は Detail / List / Search のいずれか) |
IsEnabled |
bool | 有効・無効 |
IsVisible |
bool | 表示・非表示 |
IsViewOnly |
bool | 読み取り専用 |
BackgroundColor |
string? | 背景色(取得時は親からカスケードした値も返す) |
Color |
string? | 文字色(カスケード反映) |
FontFamily |
string? | フォント(カスケード反映) |
FontSize |
int? | フォントサイズ(カスケード反映) |
| プロパティ | 型 | 説明 |
|---|---|---|
IsExpanded |
bool | 折りたたみグリッドの開閉状態(IsExpandable のとき有効) |
| プロパティ | 型 | 説明 |
|---|---|---|
SelectedIndex |
int | 現在選択中のタブ(取得・設定可。設定すると OnSelectedIndexChanged も発火) |
| プロパティ | 型 | 説明 |
|---|---|---|
IsOrMatch |
bool? | OR 検索かどうか。null のときは設定の Operator に従う |
// 初期化前にリストのロードを止める
void DetailLayoutDesign_OnBeforeInitialization()
{
ListCookingStep.AllowLoad = false;
}
// 条件に応じてセクションを隠す
AdvancedGrid.IsVisible = IsAdmin.Value;
// プログラム的にタブを切り替える
SettingTabs.SelectedIndex = 1;
// 折りたたみグリッドを開く
DetailGrid.IsExpanded = true;
// OR 検索に切り替える(SearchGridLayout)
SearchLayout.IsOrMatch = true;






