Layout布局元素

本文介绍了WPF中的三种布局元素:Grid、DockPanel和StackPanel。Grid提供灵活的网格布局,支持自定义行和列,元素可以跨行跨列。DockPanel允许元素沿四个方向停靠,最后一个元素默认填充剩余空间。StackPanel则将元素按行或列顺序排列,移除元素后能自动填补空缺。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Grid:网格。可以自定义行和列并通过行列的数量、行高列宽来调整控件的布局。近似于Html中的table。(它的子控件被放在一个一个实现定义好的小格子里面,整齐配列。Grid和其他各个Panel比较起来,功能最多也最为复杂。要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefinitions和ColumnDefinitions元素,从而定义行数和列数。而放置在Grid面板中的控件元素都必须显示采用附加属性语法定义其放置所在的行和列,它们都是以0为基准的整型值,如果没有显式设置任何行或列,Grid将会隐式地将控件加入在第0行第0列。由于Grid的组成并非简单的添加属性标记来区分行列,这也使得用户在实际应用中可以具体到某一个单元格中,所以布局起来就很精细了。)

特点:

1、可以定义任意数量的行和列,非常灵活。

2、行的高度和列的宽度可以使用绝对值、相对比例或自动调整的方式进行精确设定,并可以设置最大和最小值

3、内部元素可以设置自己所在的行和列Grid.Row和Grid.Column,还可以设置自己纵向跨几行Grid.RowSpan,横向跨几行Grid.ColumnSpan。

4、可以设置Children元素的对齐方向:水平HorizontalAlignment,垂直VerticalAlignment。

 Grid常见属性

属性

Grid.Column

读取或设定指定Framework的附加属性Grid.Column的值

Grid.ColumnSpan

读取或设定指定FrameworkElement的附加属性Grid.ColumnSpan的值

Grid.Row

读取或设定指定FrameworkElent的附加属性Grid.RowSpan的值

名称

说明

绝对尺寸

就是给一个实际的数字,但通常将此值指定为整数。

自动(Autosizing)

值为Auto,实际作用就是取实际控件所需的最小值

StarSizing

值为*或N*,实际作用就是取尽可能大的值,当某一列或行被定义为*则是尽可能大,当出现多列或行被定义为*则是代表几者之间按比例方设置尺寸

第一种,固定长度——宽度不够,会载剪,不好用。单位pixel。

第二种,自动长度——自动匹配列中最长元素的宽度。

第三种,比列长度——*表示占用剩余的全部宽度;两行都是*,将平分剩余宽度;像上面的一个2*,一个*,表示前者2/3宽度。

DockPanel:泊靠式面板。内部元素可以选择泊靠的方向(上下左右),类似于Winform中设置控件的Dock属性(可以使子元素通过描点的形式排列,这些对象位于Children属性中。DockPanel会对每个子元素进行排序,并将根据指定的边进行停靠,多个停靠在同侧的元素则按顺序排序。指定的停靠边的控件,会根据定义的顺序占领边角,所有控件绝不会交叠。后添加的元素只能使用剩余空间,无论对DockPanel的最后一个子元素设置任何停靠值,该子元素都将始终填满剩余的空间。如果不希望最后一个元素填充剩余区域,可以将DockPanel属性LastChildFill设置为false,还必须为最后一个子元素显示指定停靠方向。)

StackPanel:栈式面板。可将包含的元素在水平或垂直方向排成一条线,当移除一个元素后,后面的元素会自动向前填充空缺。(将控件按照行或列来顺序排列,当不会换行。通过设置面板的Orientation属性设置了两种排列方式:横排(Horizontal)和竖排(Vertical默认的)。水平排列时,每个元素都与面板一样高;垂直排列时,每个元素都与面板一样宽。如果包含的元素超过了面板空间,它只会载断多出的内容。元素的Margin属性用于使元素之间产生一定得间隔,当元素空间大于其内容空间时,剩余空间将由HorizontalAlignment和VerticalAlignment)

特点:

每个元素各占一行或者一列

使用场合:

同类元素需要紧凑排列(如制作菜单和列表)

移除其中的元素后能够自动补缺的布局或者动画。

StackPanel的三个属性

属性名称

数据类型

可取值

描述

Orientaion

Orientation枚举

Horizontal Vertical

决定内部元素是横向累积还是纵向累积

HorizontalAliignment

HorizontalAlignment

Left Center Right Stretch

决定内部元素水平方向上的对齐方式

VerticalAlignment

VerticalAlignment枚举

Top Center Bottom Stretch

决定内部元素竖直方向上的对齐方式


 

### 反应网格布局(React-Grid-Layout)的布局属性及配置 `react-grid-layout` 是一个基于 React 的可拖拽和调整大小的网格布局组件,支持响应式断点设置。以下是其主要布局属性及其功能描述: #### 1. **基础属性** 这些属性定义了整个网格的基本结构。 - `className`: 设置容器类名以便于样式化[^2]。 ```javascript className="custom-class" ``` - `cols`: 定义列数,默认为 12 列。可以通过此参数自定义列的数量以适应不同屏幕尺寸的需求。 ```javascript cols={12} ``` - `rowHeight`: 行的高度单位,通常以像素表示。它决定了每一行的实际高度。 ```javascript rowHeight={30} ``` - `width`: 网格宽度,用于计算每列的具体宽度。可以是一个固定的数值或者通过动态获取窗口宽度来实现自动适配。 ```javascript width={window.innerWidth * 0.8} // 动态宽度 ``` #### 2. **布局数据** 这是核心部分之一,用来指定每个子项的位置以及大小。 - `layout`: 提供初始布局的数据数组。每一个对象代表一个子元素,并包含如下字段: - `i`: 子项目的唯一标识符; - `x`, `y`: 起始位置坐标(左上角),分别对应水平方向上的第几列和垂直方向上的第几行; - `w`, `h`: 占据多少列宽高; 示例代码展示如何初始化两个项目 A 和 B 的位置与尺寸: ```javascript const layout = [ { i: 'a', x: 0, y: 0, w: 1, h: 2 }, { i: 'b', x: 1, y: 0, w: 3, h: 2 } ]; ``` #### 3. **交互行为控制** - `isDraggable`: 是否允许用户手动移动各个区块。 ```javascript isDraggable={true} ``` - `isResizable`: 控制是否能够改变区块大小。 ```javascript isResizable={false} ``` #### 4. **事件监听器** 为了增强用户体验并捕获用户的操作动作,提供了多种回调函数接口。 - `onLayoutChange(layout)`: 当布局发生变化时触发该方法,接收新的布局作为参数。 ```javascript onLayoutChange={(newLayout) => console.log(newLayout)} ``` #### 5. **其他高级选项** - `compactType`: 自动紧凑排列的方式选择,有 `'vertical' | 'horizontal' | null` 几种模式可供挑选。 ```javascript compactType='vertical' ``` - `margin`: 各单元之间的间距设定,接受二维数组形式 `[leftRightMargin, topBottomMargin]` 来单独调节横向纵向间隔距离。 ```javascript margin={[10, 10]} ``` - `useCSSTransforms`: 开启 CSS transform 属性加速渲染效果提升性能表现。 ```javascript useCSSTransforms={true} ``` --- ### 示例综合应用案例 下面给出一段完整的例子演示上述提到的一些常用特性组合起来构建灵活多变的应用场景: ```jsx import React from 'react'; import { Responsive as ResponsiveGridLayout } from 'react-grid-layout'; class App extends React.Component { state = { layouts: { lg: [{ i: 'a', x: 0, y: 0, w: 2, h: 2 }], md: [{ i: 'a', x: 0, y: 0, w: 1, h: 1 }] } }; render() { return ( <ResponsiveGridLayout className="layout" layouts={this.state.layouts} cols={{ lg: 12, md: 9 }} rowHeight={30} width={1200} isDraggable={true} isResizable={true} onLayoutChange={(layout) => this.setState({ layouts })} > <div key="a">Item A</div> </ResponsiveGridLayout> ); } } export default App; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值