问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

控件的位置和布局(Windows 窗体 .NET)

创作时间:
作者:
@小白创作中心

控件的位置和布局(Windows 窗体 .NET)

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/dotnet/desktop/winforms/controls/layout?view=netdesktop-9.0

在Windows窗体应用程序开发中,控件的布局和位置管理是UI设计的核心部分。本文详细介绍了.NET框架中各种控件布局的原理和实现方法,包括固定位置、自动布局、边距填充等关键概念,并深入讲解了窗体、面板、表格布局等容器控件的特性。对于.NET开发者来说,本文是一份全面且实用的布局指南。

Windows 窗体中的控件位置不仅由控件确定,还由控件的父级确定。 本文介绍控件提供的不同设置以及影响布局的不同类型的父容器。

固定位置和大小

控件在父级上的位置由父级表面左上角的Location属性的值确定。 父级中左上角的位置坐标为
(x0,y0)
。 控件的大小由Size属性确定,表示控件的宽度和高度。

控件相对于容器 的位置
当控件被添加到支持自动定位的父控件时,该控件的位置和大小会发生改变。 在这种情况下,可能无法手动调整控件的位置和大小,具体取决于父级的类型。

MaximumSize和MinimumSize属性有助于设置控件可以使用的最小和最大空间。

边距和填充

有两个控件属性可帮助精确放置控件:Margin和Padding。

Margin属性定义控件周围的空间,该空间使其他控件与控件的边框保持指定距离。

Padding属性定义控件内部的空间,该空间用于保持控件的内容(例如,其Text属性的值)与控件边框保持一个指定的距离。

下图显示了控件上的Margin和Padding属性。

在定位和调整控件大小时,Visual Studio 设计器将遵循这些属性。 对齐线显示为参考线,有助于你保持在控件的指定边距之外。 例如,在将控件拖到另一个控件旁边时,Visual Studio 会显示对齐线:

自动放置和大小

控件可以自动放置在其父级中。 某些父级容器会强制放置,而另一些容器会遵循指导放置的控件设置。 控件上有两个属性可帮助在父级中实现自动放置和自动调整大小,它们是Dock和Anchor。

拖动顺序可影响自动放置。 控件的拖动顺序由父级Controls集合中控件的索引确定。 此索引称为Z-order。 每个控件都按其在集合中的相反顺序进行拖动。 这意味着,该集合是先入后出、后入先出的集合。

MinimumSize和MaximumSize属性有助于设置控件可以使用的最小和最大空间。

码头

Dock
属性可设置控件的哪个边与父级的对应边对齐,以及如何在父级中调整控件的大小。

停靠控件时,容器将确定控件应占据的空间,然后调整其大小并放置。 基于停靠样式,仍采用控件的宽度和高度。 例如,如果将控件停靠在顶部,则采用控件的Height,但自动调整Width。 如果将控件停靠在左侧,则采用控件的Width,但自动调整Height。

无法手动设置控件的Location,因为停靠控件将自动控制其位置。

控件的Z-order会影响停靠。 对停靠后的控件进行布局时将占用可用空间。 例如,如果控件先出并停靠在顶部,则它将占用容器的整个宽度。 如果下一个控件被停靠在左侧,则该控件的可用垂直空间较少。

如果控件的Z-order倒置,停靠在左侧的控件将拥有更多的初始可用空间。 该控件使用容器的整个高度。 停靠在顶部的控件具有较少的水平空间。

随着容器增大和缩小,停靠在容器上的控件将重新定位并调整大小,以保持其位置和大小处于适当状态。

如果多个控件停靠在容器的同一侧,则根据其Z-order将其堆叠。

通过定位控件,可将控件绑定到父级容器的一侧或多侧。 容器尺寸发生变化时,任何子级控件都将保持其与定位侧的距离。

控件可以定位到一侧或多侧,不存在限制。 定位点由Anchor属性设置。

自动调整大小

AutoSize属性使控件能够根据需要更改其大小,以适应由PreferredSize属性指定的大小。 通过设置
AutoSizeMode
属性来调整特定控件的大小行为。

只有某些控件支持AutoSize属性。 此外,支持AutoSize属性的某些控件还支持
AutoSizeMode
属性。

Always true 行为 描述
自动调整大小是一种运行时间功能。 这意味着它永远不会增大或缩小控件,因此不会产生进一步的影响。
如果控件更改大小,则其Location属性的值始终保持不变。 控件的内容导致控件增大时,控件将向右和向下扩展。 控件不会向左侧扩展。
AutoSize为true时,采用Dock和Anchor属性。 控件的Location属性的值调整为正确的值。Label控件是此规则的例外。 将停靠的Label控件的AutoSize属性的值设置为true时,Label控件将不会拉伸。
无论控件AutoSize属性的值如何,控件的MaximumSize和MinimumSize属性始终受到尊重。 MaximumSize和MinimumSize属性不受AutoSize属性的影响。
默认情况下没有设置最小大小。 这意味着,如果控件设置为在AutoSize下收缩并且没有内容,则其Size属性的值为(0x,0y)。 在这种情况下,控件将缩小为点,且不明显可见。
如果控件未实现GetPreferredSize方法,GetPreferredSize方法将返回分配给Size属性的最后一个值。 这意味着将AutoSize设置为true将不起作用。
TableLayoutPanel单元格中的控件始终会缩小以适应单元格,直到达到其MinimumSize。 此大小被规定为最大值。 当单元格是AutoSize行或列的一部分时,情况并非如此。

AutoSizeMode 属性

AutoSizeMode属性提供对默认AutoSize行为的更精细的控制。
AutoSizeMode
属性指定控件如何根据其内容调整自身大小。 例如,内容可以是Button控件的文本或容器的子控件。
以下列表显示了
AutoSizeMode
值及其行为。

AutoSizeMode.GrowAndShrink
控件会增大或收缩以包含其内容。
MinimumSize和MaximumSize的值会被接受,但Size属性的当前值会被忽略。
这与具有AutoSize属性的控件的行为相同,没有
AutoSizeMode
属性。

AutoSizeMode.GrowOnly
控件会根据需要增大以包含其内容,但不会缩小到小于其Size属性指定的值。
这是
AutoSizeMode
的默认值。

支持 AutoSize 属性的控件

下表描述了各控件对自动调整大小的支持级别:

设计环境中的 AutoSize

下表根据控件AutoSize和
AutoSizeMode
属性的值,在设计时描述控件的大小调整行为。替代SelectionRules属性以确定给定控件是否处于用户可调整大小的状态。 在下表中,“不能调整大小”表示仅Moveable,“可调整大小”表示AllSizeable和Moveable。
AutoSize设置 AutoSizeMode设置 行为
true 属性不可用。 用户无法在设计时调整控件的大小,以下控件除外:-TextBox-MaskedTextBox-RichTextBox-TrackBar
true GrowAndShrink 用户无法在设计时调整控件的大小。
true GrowOnly 用户可以在设计时调整控件的大小。 设置Size属性时,用户只能增加控件的大小。
已隐藏false或AutoSize 不適用。 用户可以在设计时调整控件的大小。

说明
为了最大限度地提高工作效率,Visual Studio 中的 Windows 窗体设计器会隐藏Form类的AutoSize属性。 在设计时,窗体的行为如同AutoSize属性设置为
false
,而不考虑其实际设置如何。 在运行时,不会进行特殊调整,并且会按照属性设置指定的方式应用AutoSize属性。

容器:窗体

Form是 Windows Forms 的主要对象。 Windows 窗体应用程序通常会始终显示窗体。 窗体包含控件,并采用控件的Location和Size属性来实现手动放置。 窗体还响应Dock属性,以实现自动放置。

大多数时候,窗体的边缘会有抓手,允许用户调整窗体的大小。 控件的Anchor属性允许控件在调整窗体大小时增大和缩小。

容器:面板

Panel控件类似于表单,因为它仅仅是把控件组合在一起。 它支持窗体所支持的手动和自动放置样式。 有关详细信息,请参阅容器:窗体部分。

面板与父级无缝相融,并切断超出面板边界的控件的任何区域。 如果控件位于面板边界之外,并且AutoScroll设置为
true
,将显示滚动条,用户可以滚动面板。

与组框控件不同,面板没有标题和边框。


上图具有一个面板,其中设置了BorderStyle属性,用于演示面板的边界。

容器:分组框

GroupBox控件为其他控件提供可识别的分组。 通常,可使用分组框按功能细分窗体。 例如,你可能有一个表示个人信息的信息表单,各个与地址相关的字段将归类在一起。 设计时,可轻松移动分组框及其包含的控件。

分组框支持窗体所支持的手动和自动放置样式。 更多信息,请参阅容器:表单节。 分组框还会切断控件超出面板边界的任何部分。

与面板控件不同,组框无法滚动内容和显示滚动条。

容器:流布局

FlowLayoutPanel控件按水平或垂直流方向排列其内容。 可以将控件的内容从一行换行到下一行,也可以从一列换行到下一列。 或者,可以剪切其内容,而非进行换行。

可以通过设置FlowDirection属性的值来指定流方向。FlowLayoutPanel控件在从右到左 (RTL) 布局中正确地反转其排列方向。 也可通过设置WrapContents属性的值来指定是对FlowLayoutPanel控件的内容进行换行还是剪切。

将AutoSize属性设置为
true
时,FlowLayoutPanel控件会自动调整其内容的大小。 它还为其子控件提供
FlowBreak
属性。 将
FlowBreak
属性的值设置为
true
会导致FlowLayoutPanel控件停止在当前流方向中布局控件,并换行到下一行或列。

上图包含两个
FlowLayoutPanel
控件,其中BorderStyle属性设置为演示控件边界。

容器:表格布局

TableLayoutPanel控件在网格中排列其内容。 由于布局是在设计时和运行时完成的,因此它可以在应用程序环境发生更改时动态更改。 这使面板中的控件能够按比例调整大小,因此它们可以响应变化,比如父控件尺寸的调整或由于本地化导致的文本长度变化。

任何 Windows 窗体控件均可以是TableLayoutPanel控制的子控件,包括TableLayoutPanel的其他实例。 这样,就可以构建适应运行时更改的复杂布局。

在TableLayoutPanel控件充满子控件后,还可控制扩展的方向(水平或垂直)。 默认情况下,TableLayoutPanel控件通过添加行向下展开。

可以使用RowStyles和ColumnStyles属性来控制行和列的大小和样式。 可以单独设置行或列的属性。

TableLayoutPanel控件将以下属性添加到其子控件:
Cell

Column

Row

ColumnSpan

RowSpan

上图包含一个表,其中设置了CellBorderStyle属性来演示每个单元格的边界。

容器:拆分容器

可以将 Windows 窗体SplitContainer控件视为复合控件;它是两个面板,由可移动条分隔。 当鼠标指针位于条上时,指针的形状会改变,以指示该条是可移动的。

使用SplitContainer控件,可以创建复杂的用户界面;通常,一个面板中的选择决定了另一个面板中显示的对象。 这种排列方式对于显示和浏览信息非常有效。 使用两个面板可以聚合区域中的信息,条形图或“拆分器”使用户能够轻松调整面板的大小。

上图的拆分容器用于创建左右窗格。 右窗格包含第二个拆分容器,其中Orientation设置为Vertical。BorderStyle属性设置为演示每个面板的边界。

容器:选项卡控件

TabControl显示多个选项卡,类似于笔记本中的分隔符或文件柜中文件夹上的标签。 选项卡可以包含图片和其他控件。 使用选项卡控件生成在 Windows 操作系统中显示许多位置的多页对话框类型,例如控制面板和显示属性。 此外,可以使用TabControl创建属性页,这些页用于设置一组相关属性。

TabControl最重要的属性是TabPages,其中包含各个选项卡。 每个单独的选项卡都是一个TabPage对象。

本文原文来自Microsoft官方文档

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号