Windows フォームでのコントロールの配置は、コントロールだけでなく、コントロールの親によっても決定されます。 この記事では、コントロールによって提供されるさまざまな設定と、レイアウトに影響を与えるさまざまな種類の親コンテナーについて説明します。
固定位置とサイズ
コントロールが親に表示される位置は、親サーフェスの左上を基準にした Location プロパティの値によって決まります。 親コントロールの左上の位置座標が (x0,y0)
。 コントロールのサイズは、 Size プロパティによって決定され、コントロールの幅と高さを表します。
自動配置を適用する親にコントロールを追加すると、コントロールの位置とサイズが変更されます。 この場合、親の種類によっては、コントロールの位置とサイズが手動で調整されない場合があります。
MaximumSizeプロパティとMinimumSizeプロパティは、コントロールで使用できる最小領域と最大領域を設定するのに役立ちます。
余白とパディング
コントロールの正確な配置に役立つコントロール プロパティには、 Margin と Paddingの 2 つがあります。
Margin プロパティは、コントロールの境界線から指定した距離を他のコントロールに保持するコントロールの周囲のスペースを定義します。
Padding プロパティは、コントロールのコンテンツ (Text プロパティの値など) をコントロールの境界線から指定した距離に保つコントロールの内部のスペースを定義します。
次の図は、コントロールの Margin プロパティと Padding プロパティを示しています。
Visual Studio Designer では、コントロールの配置とサイズ変更を行うときに、これらのプロパティが考慮されます。 スナップ線は、コントロールの指定された余白の外側に留まるのに役立つガイドとして表示されます。 たとえば、コントロールを別のコントロールの横にドラッグすると、スナップ線が表示されます。
自動配置とサイズ
コントロールは自動的に親内に配置できます。 一部の親コンテナーは配置を強制し、他のコンテナーは配置をガイドするコントロール設定を尊重します。 親内での自動配置とサイズに役立つコントロールには、 Dock と Anchorの 2 つのプロパティがあります。
描画順序は、自動配置に影響を与える可能性があります。 コントロールが描画される順序は、親の Controls コレクション内のコントロールのインデックスによって決まります。 このインデックスは、 Z-orderと呼ばれます。 各コントロールは、コレクションに表示される逆の順序で描画されます。 つまり、コレクションは最初に最後に描画され、最後に最初に描画されたコレクションです。
MinimumSizeプロパティとMaximumSizeプロパティは、コントロールで使用できる最小領域と最大領域を設定するのに役立ちます。
ドック
Dock
プロパティは、コントロールの境界線を親の対応する側に配置し、コントロールのサイズを親内で変更する方法を設定します。
コントロールがドッキングされると、コンテナーによって占有する領域が決定され、コントロールのサイズが変更され、配置されます。 コントロールの幅と高さは、ドッキング スタイルに基づいて引き続き考慮されます。 たとえば、コントロールが上部にドッキングされている場合、コントロールの Height は考慮されますが、 Width は自動的に調整されます。 コントロールが左にドッキングされている場合、コントロールの Width は考慮されますが、 Height は自動的に調整されます。
コントロールをドッキングすると位置が自動的に設定されるため、コントロールの Location を手動で設定することはできません。
コントロールの Z-order はドッキングに影響します。 ドッキングされたコントロールがレイアウトされると、使用可能な領域が使用されます。 たとえば、コントロールが最初に描画され、上部にドッキングされている場合、コンテナーの幅全体が占有されます。 次のコントロールが左にドッキングされている場合、使用できる垂直領域が少なくなります。
コントロールの Z-order が反転されている場合、左側にドッキングされているコントロールは、より多くの初期スペースが使用可能になります。 コントロールは、コンテナーの高さ全体を使用します。 上部にドッキングされるコントロールの水平方向のスペースは少なくなります。
コンテナーが拡大および縮小されると、コンテナーにドッキングされたコントロールの位置とサイズが変更され、該当する位置とサイズが維持されます。
複数のコントロールがコンテナーの同じ側にドッキングされている場合は、 Z-orderに従って積み重ねられます。
錨
コントロールを固定すると、親コンテナーの 1 つ以上の側面にコントロールを関連付けられます。 コンテナーのサイズが変わると、アンカー付き子コントロールはアンカー付き側までの距離を維持します。
コントロールは、制限なしに 1 つまたは複数の側面に固定できます。 アンカーは、 Anchor プロパティで設定されます。
自動サイズ設定
AutoSize プロパティを使用すると、PreferredSize プロパティで指定されたサイズに合わせて、必要に応じてコントロールのサイズを変更できます。 特定のコントロールのサイズ変更の動作を調整するには、AutoSizeMode
プロパティを設定します。
AutoSize プロパティをサポートするのは、一部のコントロールのみです。 さらに、 AutoSize プロパティをサポートする一部のコントロールでは、 AutoSizeMode
プロパティもサポートされています。
動作は常にこうなります | 説明 |
---|---|
自動サイズ設定は実行時機能です。 | つまり、コントロールが拡大または縮小されることは決してなく、それ以上の効果はありません。 |
コントロールのサイズが変更された場合、その Location プロパティの値は常に一定のままになります。 | コントロールの内容が大きくなると、コントロールは右方向と下方向に拡大します。 コントロールは左に拡張されません。 |
Dock が Anchor のとき、AutoSize および true プロパティが適用されます。 |
コントロールの Location プロパティの値は、正しい値に調整されます。 Label コントロールは、この規則の例外です。 ドッキングされた Label コントロールの AutoSize プロパティの値を true に設定すると、 Label コントロールは拡大されません。 |
コントロールの MaximumSize プロパティと MinimumSize プロパティは、AutoSize プロパティの値に関係なく常に受け入れられます。 | MaximumSizeプロパティとMinimumSizeプロパティは、AutoSize プロパティの影響を受けません。 |
既定では、最小サイズは設定されていません。 | つまり、コントロールが AutoSize の下で縮小するように設定されていて、コンテンツがない場合、その Size プロパティの値は (0x,0y) 。 この場合、コントロールはポイントに縮小され、すぐには表示されません。 |
コントロールに GetPreferredSize メソッドが実装されていない場合、 GetPreferredSize メソッドは、 Size プロパティに割り当てられた最後の値を返します。 | つまり、 AutoSize を true に設定しても効果はありません。 |
TableLayoutPanel セル内のコントロールは、MinimumSize に達するまで、常にセルに収まるように縮小されます。 | このサイズは、最大サイズとして適用されます。 これは、セルが AutoSize 行または列の一部である場合には当たりません。 |
AutoSizeMode プロパティ
AutoSizeMode プロパティを使用すると、既定の AutoSize 動作をよりきめ細かく制御できます。
AutoSizeMode
プロパティは、コントロールがコンテンツに合わせてサイズを設定する方法を指定します。 たとえば、コンテンツには、Button コントロールのテキストやコンテナーの子コントロールがあります。
次の一覧は、 AutoSizeMode
値とその動作を示しています。
-
コントロールはその内容に合わせて拡大または縮小されます。
MinimumSize 値と MaximumSize 値は受け入れられますが、Size プロパティの現在の値は無視されます。
これは、AutoSize プロパティを持ち、
AutoSizeMode
プロパティを持たないコントロールと同じ動作です。 -
コントロールはコンテンツを囲むのに必要なだけ大きくなりますが、Size プロパティで指定された値より小さく縮小されることはありません。
これは、
AutoSizeMode
の既定値です。
AutoSize プロパティをサポートするコントロール
次の表では、コントロールによる自動サイズ設定のサポートのレベルについて説明します。
コントロール |
AutoSize はサポートされている |
AutoSizeMode はサポートされている |
---|---|---|
Button | ✔️ | ✔️ |
CheckedListBox | ✔️ | ✔️ |
FlowLayoutPanel | ✔️ | ✔️ |
Form | ✔️ | ✔️ |
GroupBox | ✔️ | ✔️ |
Panel | ✔️ | ✔️ |
TableLayoutPanel | ✔️ | ✔️ |
CheckBox | ✔️ | ❌ |
DomainUpDown | ✔️ | ❌ |
Label | ✔️ | ❌ |
LinkLabel | ✔️ | ❌ |
MaskedTextBox | ✔️ | ❌ |
NumericUpDown | ✔️ | ❌ |
RadioButton | ✔️ | ❌ |
TextBox | ✔️ | ❌ |
TrackBar | ✔️ | ❌ |
CheckedListBox | ❌ | ❌ |
ComboBox | ❌ | ❌ |
DataGridView | ❌ | ❌ |
DateTimePicker | ❌ | ❌ |
ListBox | ❌ | ❌ |
ListView | ❌ | ❌ |
MaskedTextBox | ❌ | ❌ |
MonthCalendar | ❌ | ❌ |
ProgressBar | ❌ | ❌ |
PropertyGrid | ❌ | ❌ |
RichTextBox | ❌ | ❌ |
SplitContainer | ❌ | ❌ |
TabControl | ❌ | ❌ |
TabPage | ❌ | ❌ |
TreeView | ❌ | ❌ |
WebBrowser | ❌ | ❌ |
ScrollBar | ❌ | ❌ |
デザイン環境でのオートサイズ
次の表では、AutoSize プロパティと AutoSizeMode
プロパティの値に基づいて、デザイン時のコントロールのサイズ変更動作について説明します。
SelectionRules プロパティをオーバーライドして、特定のコントロールがユーザーがサイズ変更可能な状態であるかどうかを判断します。 次の表では、"サイズ変更できません" は Moveable のみを意味し、"サイズ変更可能" は AllSizeable と Moveableを意味します。
AutoSize 設定 |
AutoSizeMode 設定 |
行動 |
---|---|---|
true |
プロパティは利用できません。 | 次のコントロールを除き、ユーザーはデザイン時にコントロールのサイズを変更できません。 - TextBox - MaskedTextBox - RichTextBox - TrackBar |
true |
GrowAndShrink | ユーザーはデザイン時にコントロールのサイズを変更できません。 |
true |
GrowOnly | ユーザーは、デザイン時にコントロールのサイズを変更できます。 Size プロパティが設定されている場合、ユーザーはコントロールのサイズのみを増やすことができます。 |
false または AutoSize が非表示になっている |
適用されません。 | ユーザーはデザイン時にコントロールのサイズを変更できます。 |
注
生産性を最大化するために、Visual Studio の Windows フォーム デザイナーは、AutoSize クラスの Form プロパティをシャドウします。 デザイン時、フォームは、実際の設定に関係なく、AutoSize プロパティが false
に設定されているかのように動作します。 実行時に特別な配慮はされず、プロパティ設定で指定された AutoSize プロパティが適用されます。
コンテナー: フォーム
Formは、Windows フォームのメイン オブジェクトです。 通常、Windows フォーム アプリケーションにはフォームが常に表示されます。 フォームにはコントロールが含まれており、手動配置のためにコントロールの Location プロパティと Size プロパティを考慮します。 フォームは、自動配置のために Dock プロパティにも応答します。
ほとんどの場合、フォームの端にグリップがあり、ユーザーはフォームのサイズを変更できます。 コントロールの Anchor プロパティを使用すると、フォームのサイズ変更に合わせてコントロールを拡大および縮小できます。
コンテナー: パネル
Panel コントロールは、単にコントロールをグループ化するという点でフォームに似ています。 フォームと同じ手動配置スタイルと自動配置スタイルがサポートされます。 詳細については、「 コンテナー: フォーム 」セクションを参照してください。
パネルは親とシームレスにブレンドされ、パネルの境界外にあるコントロールの領域を遮断します。 コントロールがパネルの境界外にあり、 AutoScroll が true
に設定されている場合は、スクロール バーが表示され、ユーザーはパネルをスクロールできます。
グループ ボックス コントロールとは異なり、パネルにはキャプションと境界線がありません。
上の図には、パネルの境界を示す BorderStyle プロパティが設定されたパネルがあります。
コンテナー: グループボックス
GroupBox コントロールは、他のコントロールに対して識別可能なグループ化を提供します。 通常、グループ ボックスを使用して、フォームを関数別に分割します。 たとえば、個人情報を表すフォームがあり、住所に関連するフィールドがグループ化される場合があります。 デザイン時には、含まれているコントロールと共にグループ ボックスを簡単に移動できます。
グループ ボックスは、フォームと同じ手動配置スタイルと自動配置スタイルをサポートします。 詳細については、「 コンテナー: フォーム 」セクションを参照してください。 また、グループ ボックスは、パネルの境界外にあるコントロールの任意の部分を切断します。
パネル コントロールとは異なり、グループ ボックスにはコンテンツをスクロールしてスクロール バーを表示する機能がありません。
コンテナー: フロー レイアウト
FlowLayoutPanel コントロールは、コンテンツを水平方向または垂直方向に配置します。 コントロールの内容は、1 つの行から次の行、または 1 つの列から次の列にラップできます。 または、コンテンツをラップする代わりにクリップすることもできます。
FlowDirection プロパティの値を設定することで、フローの方向を指定できます。 FlowLayoutPanel コントロールは、右から左 (RTL) レイアウトのフロー方向を正しく反転させます。 FlowLayoutPanel プロパティの値を設定して、WrapContents コントロールの内容をラップするかクリップするかを指定することもできます。
FlowLayoutPanel プロパティを AutoSizeに設定すると、true
コントロールの内容のサイズが自動的に変更されます。 また、子コントロールに FlowBreak
プロパティも提供します。
FlowBreak
プロパティの値を true
に設定すると、FlowLayoutPanel コントロールは現在のフロー方向のコントロールのレイアウトを停止し、次の行または列に折り返されます。
上の図には、コントロールの境界を示すために FlowLayoutPanel
プロパティが設定された 2 つのBorderStyle コントロールがあります。
コンテナー: テーブル レイアウト
TableLayoutPanel コントロールは、その内容をグリッドに配置します。 レイアウトはデザイン時と実行時の両方で行われるため、アプリケーション環境の変化に応じて動的に変更される可能性があります。 これにより、パネル内のコントロールのサイズを比例的に変更できるため、親コントロールのサイズ変更やローカライズによるテキストの長さの変更などの変更に対応できます。
Windows フォーム コントロールは、TableLayoutPanelの他のインスタンスを含め、TableLayoutPanel コントロールの子にすることができます。 これにより、実行時の変更に適応する高度なレイアウトを構築できます。
また、 TableLayoutPanel コントロールが子コントロールでいっぱいになった後に、展開の方向 (水平または垂直) を制御することもできます。 既定では、 TableLayoutPanel コントロールは行を追加することで下方向に展開されます。
RowStylesプロパティとColumnStylesプロパティを使用して、行と列のサイズとスタイルを制御できます。 行または列のプロパティは個別に設定できます。
TableLayoutPanel コントロールは、子コントロールに、Cell
、Column
、Row
、ColumnSpan
、RowSpan
の各プロパティを追加します。
上の図には、各セルの境界を示す CellBorderStyle プロパティが設定されたテーブルがあります。
コンテナー: 分割コンテナー
Windows フォーム SplitContainer コントロールは複合コントロールと考えることができます。これは、移動可能なバーで区切られた 2 つのパネルです。 マウス ポインターがバーの上にある場合、ポインターは図形を変更して、バーが移動可能であることを示します。
SplitContainer コントロールを使用すると、複雑なユーザー インターフェイスを作成できます。多くの場合、1 つのパネルで選択すると、もう一方のパネルに表示されるオブジェクトが決まります。 この配置は、情報の表示と閲覧に有効です。 2 つのパネルを使用すると、領域の情報を集約でき、バー ("分割") を使用すると、ユーザーはパネルのサイズを簡単に変更できます。
上の図には、左右のウィンドウを作成するための分割コンテナーがあります。 右側のウィンドウには、 Orientation が Verticalに設定された 2 つ目の分割コンテナーが含まれています。 BorderStyleプロパティは、各パネルの境界を示すために設定されます。
コンテナー: タブ コントロール
TabControlには、ノートブックの分割線や、ファイリング キャビネット内の一連のフォルダー内のラベルなど、複数のタブが表示されます。 タブには、画像やその他のコントロールを含めることができます。 タブ コントロールを使用して、コントロール パネルや表示プロパティなど、Windows オペレーティング システムの多くの場所に表示される複数ページのダイアログ ボックスの種類を生成します。 さらに、TabControl を使用してプロパティ ページを作成できます。プロパティ ページは、関連するプロパティのグループを設定するために使用されます。
TabControl の最も重要なプロパティは、個々のタブを含む TabPagesです。 個々のタブは、TabPage オブジェクトです。
.NET Desktop feedback