设计器里把控件摆整齐,窗口一放大仍能跟着伸:用 停靠、水平/垂直布局 和 弹簧。YSS 只改外观,不改坐标;不要给布局或弹簧写 layout { … }。
设计视图工具栏:水平布局、垂直布局。组件树可右键「放入水平/垂直布局」「插入弹簧」。选中选项卡/堆叠的某一页时,可对该页整页套布局。
硬约束
- 绝对坐标(左边/顶边/宽高)是设计基准;进了布局后,运行时按约束重算。
- 菜单栏、工具栏、状态栏用各自的贴边,不要和普通停靠混用。
- 布局与弹簧没有 YSS 选择器。
- 代码里一般不用手改布局几何;需要时用控件的
停靠、左边等属性(见各控件文档)。
三种办法,怎么选
| 做法 | 适合 | 窗口变大时 |
|---|---|---|
| 不设停靠、不进布局 | 固定工具窗、对话框 | 控件停在设计位置 |
| 停靠 上/下/左/右/填充 | 一块贴边(如底栏、整块填满) | 贴边控件吃客户区边缘 |
| 水平/垂直布局 + 弹簧 | 工具条、表单、列表+详情随窗拉伸 | 按占比分摊剩余空间 |
多数业务窗:上面一条水平布局(按钮+弹簧)+ 中间填充的表格/浏览器。
停靠
属性面板「布局」→ 停靠:无 / 上 / 下 / 左 / 右 / 填充。
顺序:专用栏(菜单/工具/状态)先贴边 → 再排设了停靠的控件 → 其余保持设计坐标。
- 上/下/左/右:贴在客户区该侧,厚度用设计时的宽或高。
- 填充:吃掉停靠之后剩下的整块中间区域(常见:表格、浏览器、选项卡)。
- 同一侧多个停靠会依次占用。
普通按钮不要每个都停靠;一排按钮请放进水平布局。
水平布局 / 垂直布局
放进去
- 多选同一父级下的控件(按住 Ctrl 点选,或框选)。
- 点工具栏 水平布局 或 垂直布局,或组件树右键「放入…布局」。
- 布局框会出现在设计器里(运行时通常看不见边框)。
也可先拖一个空布局,再把控件拖进框内(蓝色插入线:水平布局是竖线,垂直布局是横线)。
页内布局:选中选项卡或堆叠的当前页,再点水平/垂直布局,布局会铺满该页内容区。
嵌套:水平布局里再套垂直布局(例如左侧一列标签、右侧一列表单)。
布局自身属性
选中布局框(不要点到子控件)后,属性面板「布局」常见项:
| 属性 | 作用 |
|---|---|
| 左边距 / 上边距 / 右边距 / 下边距 | 布局内容区相对外框的内缩 |
| 间距 | 子项之间的空隙(像素) |
| 布局占比 | 写给本布局的各个子项的权重,逗号分隔,如 0,1,2(见下) |
| 拉伸 | 本布局相对父布局分摊剩余空间的权重;0 尽量保持设计尺寸 |
子控件在布局里的 对齐(水平/垂直)决定交叉轴:例如水平布局里标签垂直居中。
最小宽度 / 最小高度 / 最大宽度 / 最大高度:限制子项被压扁或拉得过大。
弹簧
弹簧吃掉「还没分完」的空档,把按钮顶到两侧或把一块内容顶下去。
- 在布局中右键 插入弹簧,方向跟当前布局走(水平布局 → 水平弹簧)。
- 水平:
[确定] [取消] [弹簧]→ 按钮靠左,右边留白随窗变宽。 - 水平:
[弹簧] [确定]→ 按钮靠右。 - 垂直:弹簧在列表和底栏之间,底栏贴底。
弹簧没有标题、也不走 YSS。不要给弹簧设边框。
布局占比与拉伸
剩余空间按权重分,不是按像素写死。
子项「拉伸」(选中按钮、文本框等):
0:尽量用设计宽高(交叉轴仍可能被布局拉齐)。>0:和兄弟里同样拉伸的项按数字比例分剩余空间。1与1对半分;1与2则 1:2。
布局上的「布局占比」:一串数字对应子项从左到右(或从上到下),例如三个子项写 0,1,1:第一项按内容/设计尺寸,后两项平分剩余。数字个数应与子项数量一致。
有弹簧时,弹簧会先参与分摊;固定按钮通常拉伸为 0。
分组框、选项卡、堆叠
子控件用 XML 的 所属容器 挂在容器上(设计器拖进去会自动写)。坐标相对容器内容区(分组框会扣掉标题栏)。
- 分组框里再放垂直布局:标签+输入排成一列,分组框本身可停靠或进外层布局。
- 选项卡:每一页可以有自己的布局;先点页再套布局。
- 堆叠:只显示当前页,布局算法与选项卡页相同。
和绝对坐标一起用
| 场景 | 建议 |
|---|---|
| 登录框、固定大小对话框 | 绝对坐标即可,窗体禁止最大化 |
| 主界面随窗拉伸 | 根上用布局,或中间一块 停靠=填充 |
| 只拉伸中间表格 | 表格 停靠=填充,顶栏用水平布局 |
| 工具条按钮间距固定、右侧留白 | 水平布局 + 末尾弹簧 |
改窗口大小后,设计器会按同一套规则重排,和 F5 运行时一致。
XML 里长什么样
一般不用手改。设计器保存后类似:
<水平布局 名称="水平布局1" typeId="layouth" 左边="8" 顶边="8" 宽度="640" 高度="36" 间距="8">
</水平布局>
<按钮 名称="按钮1" typeId="button" 所属容器="水平布局1" 标题="确定".../>
<水平弹簧 名称="水平弹簧1" typeId="spacerh" 所属容器="水平布局1"/>
| XML | typeId |
|---|---|
| 水平布局 | layouth |
| 垂直布局 | layoutv |
| 水平弹簧 | spacerh |
| 垂直弹簧 | spacerv |
子控件靠 所属容器="布局名称" 归属。停靠 写在普通控件上:无 / 上 / 下 / 左 / 右 / 填充。
易错对照
| 容易踩的 | 改法 |
|---|---|
| 每个控件都设停靠,叠在一起 | 一排控件用布局;中间大块才 填充 |
用 YSS 改 left/width 当排版 |
几何交给布局/停靠;YSS 只写颜色圆角 |
| 弹簧当按钮用、写标题 | 弹簧只占位 |
| 选项卡看起来没铺满 | 选中页再套布局,或选项卡停靠填充 |
| 文本框在水平布局里被压成一条线 | 设最小宽度,或布局占比给它权重 |
窗口 XML 结构见 window-xml.md。样式见 YSS.md。